def initUI(self): exitAction = QAction(QIcon("exit.svg"), '&Exit', self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip("Exit application") exitAction.triggered.connect(self.close) self.statusBar() menubar = self.menuBar() fileMenu = menubar.addMenu("&File") fileMenu.addAction(exitAction) self.setGeometry(300, 300, 250, 150) self.setWindowTitle("Menubar") self.show()
def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("My App") label = QLabel("Hello!") label.setAlignment(Qt.AlignCenter) self.setCentralWidget(label) toolbar = QToolBar("My main toolbar") self.addToolBar(toolbar) button_action = QAction("Your button", self) button_action.setStatusTip("This is your button") button_action.triggered.connect(self.onMyToolBarButtonClick) toolbar.addAction(button_action)
def init_ui(self): self.textEdit = QTextEdit() self.setCentralWidget(self.textEdit) self.statusBar() openFile = QAction(QIcon('open.svg'), 'Open', self) openFile.setShortcut("Ctrl+O") openFile.setStatusTip("Open new File") openFile.triggered.connect(self.show_dialog) menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(openFile) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('File dialog')
def initUI(self): textEdit = QTextEdit() self.setCentralWidget(textEdit) exitAction = QAction("Exit", self) exitAction.setShortcut("Ctrl+Q") exitAction.setStatusTip("Exit application") exitAction.triggered.connect(self.close) self.statusBar() menuBar = self.menuBar() fileMenu = menuBar.addMenu("&File") fileMenu.addAction(exitAction) toolbar = self.addToolBar("Exit") toolbar.addAction(exitAction) self.setGeometry(300, 300, 250, 250) self.setWindowTitle("Main Window")
def initUI(self): exitAction = QAction(QIcon('icons/exit.bmp'), 'Exit', self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip('Exit application') exitAction.triggered.connect(self.close) helpAction = QAction(QIcon('icons/help.png'), 'Version', self) helpAction.setShortcut('Ctrl+D') helpAction.setStatusTip('Show application\'s version') helpAction.triggered.connect(self.show_version) qt_version_helpAction = QAction(QIcon('icons/help.png'), "Qt's version", self) qt_version_helpAction.setShortcut('Ctrl+A') qt_version_helpAction.setStatusTip('Show Qt\'s version') qt_version_helpAction.triggered.connect(self.show_qt_version) self.statusBar() menubar = self.menuBar() fileMenu = menubar.addMenu('File') menubar.addMenu('Edit') helpMenu = menubar.addMenu('Help') fileMenu.addAction(exitAction) helpMenu.addAction(helpAction) helpMenu.addSeparator() helpMenu.addAction(qt_version_helpAction) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Menubar') self.show()
class UIBuilder(object): """Constructs the UI for a main application window""" def setup(self, main_window: QMainWindow) -> None: """ Initialize the UI. :param main_window: An instance of the `QMainWindow` class. :type main_window: :class:`QMainWindow` """ main_window.setObjectName("main_window") main_window.setWindowTitle("TeaseAI") main_window.resize(1137, 751) main_window.setSizePolicy(*EXP_EXP) main_window.setTabShape(QTabWidget.Rounded) self.menubar = QMenuBar(main_window) self.menubar.setObjectName("menubar") self.menubar.setGeometry(0, 0, 1137, 23) self.file_menu = QMenu("File", self.menubar) self.file_menu.setObjectName("file_men") self.server_menu = QMenu("Server", self.menubar) self.server_menu.setObjectName("server_men") self.options_menu = QMenu("Options", self.menubar) self.options_menu.setObjectName("options_men") self.media_menu = QMenu("Media", self.menubar) self.media_menu.setObjectName("media_men") main_window.setMenuBar(self.menubar) self.exit = QAction("Exit", main_window) self.exit.setObjectName("exit") self.start_server = QAction("Start Server", main_window) self.start_server.setObjectName("start_server") self.connect_server = QAction("Connect to Server", main_window) self.connect_server.setObjectName("connect_server") self.kill_server = QAction("Kill Server", main_window) self.kill_server.setObjectName("kill_server") self.options = QAction("Options", main_window) self.options.setObjectName("options") self.start_webcam = QAction("Start Webcam", main_window) self.start_webcam.setObjectName("start_webcam") self.start_webcam.setCheckable(False) self.centralwidget = QWidget(main_window) self.centralwidget.setObjectName("centralwidget") self.centralwidget.setContentsMargins(QMargins(0, 0, 0, 0)) self.centralwidget.setSizePolicy(*EXP_EXP) self.grid_layout = QGridLayout(self.centralwidget) self.media = QFrame(self.centralwidget) self.media.setObjectName("media") self.media.setSizePolicy(*EXP_EXP) self.media.setMinimumSize(200, 200) self.media.setStyleSheet("background: #000;") self.grid_layout.addWidget(self.media, 0, 0, 5, 1) self.users_label = QLabel(" Online users:", self.centralwidget) self.users_label.setObjectName("users_label") self.users_label.setMinimumSize(300, 15) self.users_label.setMaximumSize(300, 15) self.grid_layout.addWidget(self.users_label, 0, 1, 1, 2) self.online = QPlainTextEdit("", self.centralwidget) self.online.setObjectName("online") self.online.setSizePolicy(*FIX_FIX) self.online.setMinimumSize(300, 50) self.online.setMaximumSize(300, 50) self.online.setStyleSheet("margin-left: 3px;" + SUNKEN) self.online.setLineWidth(2) self.online.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.online.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.online.setSizeAdjustPolicy(QAbstractScrollArea.AdjustIgnored) self.online.setReadOnly(True) self.grid_layout.addWidget(self.online, 1, 1, 1, 2) self.chat = QPlainTextEdit("", self.centralwidget) self.chat.setObjectName("chat") self.chat.setSizePolicy(*FIX_EXP) self.chat.setMinimumSize(300, 0) self.chat.setMaximumSize(300, INFINITE) self.chat.setStyleSheet("margin-bottom: 3px; margin-top: 8px;" + SUNKEN) self.chat.setLineWidth(2) self.chat.setReadOnly(True) self.chat.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.grid_layout.addWidget(self.chat, 2, 1, 1, 2) self.input = QLineEdit(self.centralwidget) self.input.setObjectName("input") self.input.setSizePolicy(*FIX_FIX) self.input.setMinimumSize(224, 30) self.input.setMaximumSize(224, 30) self.input.setStyleSheet(SUNKEN) self.input.setEchoMode(QLineEdit.Normal) self.input.setClearButtonEnabled(True) self.grid_layout.addWidget(self.input, 3, 1, 1, 1) self.submit = QPushButton("Submit", self.centralwidget) self.submit.setObjectName("submit") self.submit.setSizePolicy(*FIX_FIX) self.submit.setMinimumSize(70, 30) self.submit.setMaximumSize(70, 30) self.grid_layout.addWidget(self.submit, 3, 2, 1, 1) self.tabs = QTabWidget(self.centralwidget) self.tabs.setObjectName("tabs") self.tabs.setSizePolicy(*FIX_FIX) self.tabs.setMinimumSize(300, 150) self.tabs.setMaximumSize(300, 150) self.tab = QWidget() self.tab.setObjectName("tab") self.tabs.addTab(self.tab, "Actions") self.tab2 = QWidget() self.tab2.setObjectName("tab2") self.tabs.addTab(self.tab2, "My Media") self.tab3 = QWidget() self.tab3.setObjectName("tab3") self.tab3.setSizePolicy(*FIX_FIX) self.grid_layout2 = QGridLayout(self.tab3) self.grid_layout2.setHorizontalSpacing(0) self.grid_layout2.setVerticalSpacing(3) self.grid_layout2.setContentsMargins(3, -1, 3, -1) self.server_folder = QLineEdit(self.tab3) self.server_folder.setObjectName("server_folder") self.grid_layout2.addWidget(self.server_folder, 0, 0, 1, 3) self.srv_browse = QPushButton("BROWSE", self.tab3) self.srv_browse.setObjectName("srv_browse") self.srv_browse.setStyleSheet("background: transparent;\n" " color: #4d4940;\n" " font-size: 8pt;\n" " font-weight: 450;\n" " padding: 6px;\n") self.grid_layout2.addWidget(self.srv_browse, 0, 3, 1, 1) self.back_button = QPushButton("", self.tab3) self.back_button.setObjectName("back_button") self.back_button.setSizePolicy(*FIX_FIX) self.back_button.setMaximumSize(SEVENTY_FIVE) self.back_button.setCursor(QCursor(Qt.PointingHandCursor)) self.back_button.setStyleSheet("border: 0;\n" "background: transparent;") icon = QIcon() icon.addFile(":/newPrefix/back_button.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.back_button.setIcon(icon) self.back_button.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.back_button, 1, 0, 1, 1) self.play_button = QPushButton("", self.tab3) self.play_button.setObjectName("play_button") self.play_button.setSizePolicy(*FIX_FIX) self.play_button.setMaximumSize(SEVENTY_FIVE) self.play_button.setCursor(QCursor(Qt.PointingHandCursor)) self.play_button.setStyleSheet("border: 0;\n" "background: transparent;") icon1 = QIcon() icon1.addFile(":/newPrefix/play_button.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.play_button.setIcon(icon1) self.play_button.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.play_button, 1, 1, 1, 1) self.stop_button = QPushButton("", self.tab3) self.stop_button.setObjectName("stop_button") self.stop_button.setSizePolicy(*FIX_FIX) self.stop_button.setMaximumSize(SEVENTY_FIVE) self.stop_button.setCursor(QCursor(Qt.PointingHandCursor)) self.stop_button.setStyleSheet("border: 0;\n" "background: transparent;") icon2 = QIcon() icon2.addFile(":/newPrefix/stop_button.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.stop_button.setIcon(icon2) self.stop_button.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.stop_button, 1, 2, 1, 1) self.fast_forward = QPushButton("", self.tab3) self.fast_forward.setObjectName("fast_forward") self.fast_forward.setSizePolicy(*FIX_FIX) self.fast_forward.setMaximumSize(SEVENTY_FIVE) self.fast_forward.setCursor(QCursor(Qt.PointingHandCursor)) self.fast_forward.setStyleSheet("border: 0;\n" "background: transparent;") icon3 = QIcon() icon3.addFile(":/newPrefix/fast_forward.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.fast_forward.setIcon(icon3) self.fast_forward.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.fast_forward, 1, 3, 1, 1) self.tabs.addTab(self.tab3, "Server Media") self.grid_layout.addWidget(self.tabs, 4, 1, 1, 2) main_window.setCentralWidget(self.centralwidget) self.statusbar = QStatusBar(main_window) self.statusbar.setObjectName("statusbar") self.statusbar.setEnabled(True) self.statusbar.setStyleSheet("margin-bottom: 5px;") self.statusbar.setSizePolicy(*EXP_FIX) self.statusbar.setMinimumSize(INFINITE, 30) self.statusbar.setMaximumSize(INFINITE, 30) self.statusbar.setSizeGripEnabled(False) main_window.setStatusBar(self.statusbar) self.menubar.addAction(self.file_menu.menuAction()) self.menubar.addAction(self.server_menu.menuAction()) self.menubar.addAction(self.options_menu.menuAction()) self.menubar.addAction(self.media_menu.menuAction()) self.file_menu.addAction(self.exit) self.server_menu.addAction(self.start_server) self.server_menu.addAction(self.connect_server) self.server_menu.addAction(self.kill_server) self.options_menu.addAction(self.options) self.media_menu.addAction(self.start_webcam) self.exit.triggered.connect(main_window.close) self.tabs.setCurrentIndex(0) QMetaObject.connectSlotsByName(main_window) self.exit.setStatusTip("Exit the program.") self.start_server.setStatusTip("Initialize a local server instance.") self.connect_server.setStatusTip("Connect to a remote server.") self.kill_server.setStatusTip("Shut down a running local server.") self.options.setStatusTip("Open the options menu.") self.start_webcam.setStatusTip("Start webcam feed.") self.tooltip = QLabel("", self.statusbar) tooltip_policy = QSizePolicy(*EXP_FIX) tooltip_policy.setHorizontalStretch(100) self.tooltip.setSizePolicy(tooltip_policy) self.tooltip.setMinimumSize(INFINITE, 26) self.tooltip.setMaximumSize(INFINITE, 26) self.server_status = QLabel("Server status:", self.statusbar) self.server_status.setSizePolicy(*FIX_FIX) self.server_status.setMinimumSize(300, 26) self.server_status.setMaximumSize(300, 26) self.client_status = QLabel("Client status:", self.statusbar) self.client_status.setSizePolicy(*FIX_FIX) self.client_status.setMinimumSize(302, 26) self.client_status.setMaximumSize(302, 26) self.statusbar.addPermanentWidget(self.tooltip) self.statusbar.addPermanentWidget(self.server_status) self.statusbar.addPermanentWidget(self.client_status) self.tooltip.setStyleSheet(SUNKEN + "margin-left: 4px;\ margin-right: 0px;") self.client_status.setStyleSheet(SUNKEN + "margin-right: 7px;") self.server_status.setStyleSheet(SUNKEN + "margin-right: 2px;\ margin-left: 2px;") self.statusbar.messageChanged.connect(main_window.status_tip)
def new_action(self, name: str, tip: str = "", shortcut: str = 'Ctrl+Q'): action = QAction(name, self) action.setShortcut(shortcut) action.setStatusTip(tip) action.triggered.connect(self.show_message_box) return action
def init_menu(self): menubar = self.menuBar() menubar.setNativeMenuBar(False) file_menu = menubar.addMenu(t("File")) setting_action = QAction( self.si(QtWidgets.QStyle.SP_FileDialogListView), t("Settings"), self) setting_action.setShortcut("Ctrl+S") setting_action.triggered.connect(self.show_setting) exit_action = QAction(self.si(QtWidgets.QStyle.SP_DialogCancelButton), t("Exit"), self) exit_action.setShortcut(QtGui.QKeySequence("Ctrl+Q")) exit_action.setStatusTip(t("Exit application")) exit_action.triggered.connect(self.close) file_menu.addAction(setting_action) file_menu.addSeparator() file_menu.addAction(exit_action) profile_menu = menubar.addMenu(t("Profiles")) new_profile_action = QAction(t("New Profile"), self) new_profile_action.triggered.connect(self.new_profile) show_profile_action = QAction(t("Current Profile Settings"), self) show_profile_action.triggered.connect(self.show_profile) delete_profile_action = QAction(t("Delete Current Profile"), self) delete_profile_action.triggered.connect(self.delete_profile) profile_menu.addAction(new_profile_action) profile_menu.addAction(show_profile_action) profile_menu.addAction(delete_profile_action) tools_menu = menubar.addMenu(t("Tools")) concat_action = QAction( QtGui.QIcon(get_icon("onyx-queue", self.app.fastflix.config.theme)), t("Concatenation Builder"), self) concat_action.triggered.connect(self.show_concat) tools_menu.addAction(concat_action) wiki_action = QAction(self.si(QtWidgets.QStyle.SP_FileDialogInfoView), t("FastFlix Wiki"), self) wiki_action.triggered.connect(self.show_wiki) about_action = QAction(self.si(QtWidgets.QStyle.SP_FileDialogInfoView), t("About"), self) about_action.triggered.connect(self.show_about) changes_action = QAction( self.si(QtWidgets.QStyle.SP_FileDialogDetailedView), t("View Changes"), self) changes_action.triggered.connect(self.show_changes) log_dir_action = QAction(self.si(QtWidgets.QStyle.SP_DialogOpenButton), t("Open Log Directory"), self) log_dir_action.triggered.connect(self.show_log_dir) log_action = QAction( self.si(QtWidgets.QStyle.SP_FileDialogDetailedView), t("View GUI Debug Logs"), self) log_action.triggered.connect(self.show_logs) report_action = QAction(self.si(QtWidgets.QStyle.SP_DialogHelpButton), t("Report Issue"), self) report_action.triggered.connect(self.open_issues) version_action = QAction(self.si(QtWidgets.QStyle.SP_BrowserReload), t("Check for Newer Version of FastFlix"), self) version_action.triggered.connect( lambda: latest_fastflix(no_new_dialog=True)) ffmpeg_update_action = QAction(self.si(QtWidgets.QStyle.SP_ArrowDown), t("Download Newest FFmpeg"), self) ffmpeg_update_action.triggered.connect(self.download_ffmpeg) clean_logs_action = QAction( self.si(QtWidgets.QStyle.SP_DialogResetButton), t("Clean Old Logs"), self) clean_logs_action.triggered.connect(self.clean_old_logs) help_menu = menubar.addMenu(t("Help")) help_menu.addAction(wiki_action) help_menu.addSeparator() help_menu.addAction(changes_action) help_menu.addAction(report_action) help_menu.addAction(log_dir_action) help_menu.addAction(log_action) help_menu.addAction(clean_logs_action) help_menu.addSeparator() help_menu.addAction(version_action) if reusables.win_based: help_menu.addAction(ffmpeg_update_action) help_menu.addSeparator() help_menu.addAction(about_action)
class Window(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.images = [] self.index = -1 self.ratio = 1 # ratio for QLabel image self.mouse_position = None self.settings = None # Extensions self.extensions = [] for format in QImageReader.supportedImageFormats(): self.extensions.append(format.data().decode('utf-8')) # Filters self.filters = [] for extension in self.extensions: self.filters.append('*.{0}'.format(str(extension))) # UI self.set_up_ui() # settings self.load_settings() def on_message_received(self, msg): """ on message received from single application Args: msg (string): file path """ self.create_images(msg) self.display_image() def set_up_ui(self): # Status Bar self.status_bar = self.statusBar() self.label_name = QLabel() self.label_numero = QLabel() self.status_bar.addPermanentWidget(self.label_name, 1) self.status_bar.addPermanentWidget(self.label_numero, 0) # Main Window self.setWindowTitle('BaloViewer') self.setWindowIcon(QIcon('baloviewer.ico')) # Label image self.image = QLabel() self.image.setScaledContents(True) # Scroll area self.scroll_area = QScrollArea() self.scroll_area.setWidget(self.image) self.scroll_area.showMaximized() self.scroll_area.setFocusPolicy(Qt.FocusPolicy.NoFocus) self.scroll_area.setAlignment(Qt.AlignmentFlag.AlignCenter) self.scroll_area.viewport().installEventFilter(self) # image list self.image_gallery = ImageGallery() self.image_gallery.itemClicked.connect(self.image_gallery_clicked) self.image_gallery.viewport().installEventFilter(self) self.dock_widget = QDockWidget('Image Gallery', self) self.dock_widget.setWidget(self.image_gallery) self.dock_widget.setFloating(False) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock_widget) # central widget self.setCentralWidget(self.scroll_area) # Action bar self.create_actions() self.create_menubar() self.create_toolbar() # option parser parser = OptionParser() parser.add_option("-f", "--file", dest="filename", help="open a file") (options, args) = parser.parse_args() parser_file = options.filename if parser_file is not None and os.path.isfile(parser_file): self.create_images(parser_file) self.display_image() def create_actions(self): # Action Open self.action_open = QAction(QIcon.fromTheme('document-open'), 'Open', self) self.action_open.setShortcut('Ctrl+O') self.action_open.setStatusTip('Open file') self.action_open.triggered.connect(self.open) # Action Save self.action_save = QAction(QIcon.fromTheme('document-save'), 'Save', self) self.action_save.setShortcut('Ctrl+S') self.action_save.setStatusTip('Save file') self.action_save.triggered.connect(self.save) # Action Copy self.action_copy = QAction(QIcon.fromTheme('edit-copy'), 'Copy', self) self.action_copy.setStatusTip('Copy') self.action_copy.triggered.connect(self.copy) # Action move self.action_move = QAction(QIcon.fromTheme('edit-cut'), 'Move', self) self.action_move.setStatusTip('Move') self.action_move.triggered.connect(self.move) # Action Delete self.action_delete = QAction(QIcon.fromTheme('edit-delete'), 'Delete', self) self.action_delete.setStatusTip('Delete') self.action_delete.triggered.connect(self.delete) # Action Quit self.action_quit = QAction(QIcon.fromTheme('application-exit'), 'Quit', self) self.action_quit.setShortcut('Ctrl+Q') self.action_quit.setStatusTip('Quit') self.action_quit.triggered.connect(self.close) # Action Rotate left self.action_rotate_left = QAction( QIcon.fromTheme('object-rotate-left'), 'Rotate left', self) self.action_rotate_left.setStatusTip('Rotate left') self.action_rotate_left.triggered.connect(self.rotate_left) # Action Rotate right self.action_rotate_right = QAction( QIcon.fromTheme('object-rotate-right'), 'Rotate right', self) self.action_rotate_right.setStatusTip('Rotate right') self.action_rotate_right.triggered.connect(self.rotate_right) # Action Mirror self.action_flip_horizontal = QAction( QIcon.fromTheme('object-flip-horizontal'), 'Flip horizontally', self) self.action_flip_horizontal.setStatusTip('Flip horizontally') self.action_flip_horizontal.triggered.connect(self.flip_horizontal) # Action Flip vertical self.action_flip_vertical = QAction( QIcon.fromTheme('object-flip-vertical'), 'Flip vertically', self) self.action_flip_vertical.setStatusTip('Flip vertically') self.action_flip_vertical.triggered.connect(self.flip_vertical) # Action Previous image self.action_previous_image = QAction(QIcon.fromTheme('go-previous'), 'Previous image', self) self.action_previous_image.setStatusTip('Previous image') self.action_previous_image.triggered.connect(self.previous_image) # Action Full screen self.action_fullscreen = QAction(QIcon.fromTheme('view-fullscreen'), 'Full screen', self) self.action_fullscreen.setStatusTip('Full screen') self.action_fullscreen.triggered.connect(self.fullscreen) # Action Normal size self.action_normal_size = QAction(QIcon.fromTheme('zoom-original'), 'Normal size', self) self.action_normal_size.setStatusTip('Normal Size') self.action_normal_size.triggered.connect(self.normal_size) # Action Fit Screen self.action_fit_screen = QAction(QIcon.fromTheme('zoom-fit-best'), 'Fit to screen', self) self.action_fit_screen.setStatusTip('Fit to screen') self.action_fit_screen.setCheckable(True) self.action_fit_screen.triggered.connect(self.fit_screen) # Action Zoom in self.action_zoom_in = QAction(QIcon.fromTheme('zoom-in'), 'Zoom in', self) self.action_zoom_in.setStatusTip('Zoom in') self.action_zoom_in.triggered.connect(self.zoom_in) # Action Zoom out self.action_zoom_out = QAction(QIcon.fromTheme('zoom-out'), 'Zoom out', self) self.action_zoom_out.setStatusTip('Zoom out') self.action_zoom_out.triggered.connect(self.zoom_out) # Action Fit height self.action_fit_vertical = QAction('Fit vertically', self) self.action_fit_vertical.setStatusTip('Fit vertically') self.action_fit_vertical.setCheckable(True) self.action_fit_vertical.triggered.connect(self.fit_height) # Action Fit width self.action_fit_horizontal = QAction('Fit horizontally', self) self.action_fit_horizontal.setStatusTip('Fit horizontally') self.action_fit_horizontal.setCheckable(True) self.action_fit_horizontal.triggered.connect(self.fit_width) # Action Fit width self.action_fit_horizontal = QAction('Fit horizontally', self) self.action_fit_horizontal.setStatusTip('Fit horizontally') self.action_fit_horizontal.setCheckable(True) self.action_fit_horizontal.triggered.connect(self.fit_width) # Action Image list self.action_image_gallery = QAction('Image gallery', self) self.action_image_gallery.setStatusTip('Image gallery') self.action_image_gallery.setCheckable(True) self.action_image_gallery.triggered.connect( self.image_gallery_triggered) # Action Next_image self.action_next_image = QAction(QIcon.fromTheme('go-next'), 'Next image', self) self.action_next_image.setStatusTip('Next image') self.action_next_image.triggered.connect(self.next_image) # Action First image self.action_first_image = QAction(QIcon.fromTheme('go-first'), 'First image', self) self.action_first_image.setStatusTip('First image') self.action_first_image.triggered.connect(self.first_image) # Action Last image self.action_last_image = QAction(QIcon.fromTheme('go-last'), 'Last image', self) self.action_last_image.setStatusTip('Last image') self.action_last_image.triggered.connect(self.last_image) # Action About self.action_about = QAction(QIcon.fromTheme('help-about'), 'About', self) self.action_about.setStatusTip('About') self.action_about.triggered.connect(self.about) def create_menubar(self): self.menubar = self.menuBar() # File self.menu_file = self.menubar.addMenu('File') self.menu_file.addAction(self.action_open) self.menu_file.addAction(self.action_save) self.menu_file.addSeparator() self.menu_file.addAction(self.action_copy) self.menu_file.addAction(self.action_move) self.menu_file.addAction(self.action_delete) self.menu_file.addSeparator() self.menu_file.addAction(self.action_quit) # Edit self.menu_edit = self.menubar.addMenu('Edit') self.menu_edit.addAction(self.action_rotate_left) self.menu_edit.addAction(self.action_rotate_right) self.menu_edit.addSeparator() self.menu_edit.addAction(self.action_flip_horizontal) self.menu_edit.addAction(self.action_flip_vertical) # View self.menu_view = self.menubar.addMenu('View') self.menu_view.addAction(self.action_fullscreen) self.menu_view.addAction(self.action_normal_size) self.menu_view.addAction(self.action_fit_screen) self.menu_view.addSeparator() self.menu_view.addAction(self.action_zoom_in) self.menu_view.addAction(self.action_zoom_out) self.menu_view.addSeparator() self.menu_view.addAction(self.action_fit_vertical) self.menu_view.addAction(self.action_fit_horizontal) self.menu_view.addSeparator() self.menu_view.addAction(self.action_image_gallery) # Go self.menu_go = self.menubar.addMenu('Go') self.menu_go.addAction(self.action_previous_image) self.menu_go.addAction(self.action_next_image) self.menu_go.addSeparator() self.menu_go.addAction(self.action_first_image) self.menu_go.addAction(self.action_last_image) # About self.menu_about = self.menubar.addMenu('About') self.menu_about.addAction(self.action_about) def create_toolbar(self): self.toolbar = self.addToolBar('Tool bar') self.toolbar.addAction(self.action_open) self.toolbar.addAction(self.action_save) self.toolbar.addSeparator() self.toolbar.addAction(self.action_fullscreen) self.toolbar.addAction(self.action_normal_size) self.toolbar.addAction(self.action_fit_screen) self.toolbar.addSeparator() self.toolbar.addAction(self.action_zoom_in) self.toolbar.addAction(self.action_zoom_out) self.toolbar.addSeparator() self.toolbar.addAction(self.action_rotate_left) self.toolbar.addAction(self.action_rotate_right) self.toolbar.addSeparator() self.toolbar.addAction(self.action_first_image) self.toolbar.addAction(self.action_previous_image) self.toolbar.addAction(self.action_next_image) self.toolbar.addAction(self.action_last_image) self.toolbar.addSeparator() self.toolbar.addAction(self.action_copy) self.toolbar.addAction(self.action_move) def load_settings(self): self.settings = QSettings() check_state = self.settings.value('view/image_gallery', True, type=bool) self.action_image_gallery.setChecked(check_state) self.image_gallery_triggered() def contextMenuEvent(self, QContextMenuEvent): menu = QMenu() menu.addAction(self.action_fullscreen) menu.addSeparator() menu.addAction(self.action_image_gallery) menu.addSeparator() menu.addAction(self.action_previous_image) menu.addAction(self.action_next_image) menu.addSeparator() menu.addAction(self.action_normal_size) menu.addAction(self.action_fit_screen) menu.addAction(self.action_fit_vertical) menu.addAction(self.action_fit_horizontal) menu.addSeparator() menu.addAction(self.action_zoom_in) menu.addAction(self.action_zoom_out) menu.addSeparator() menu.addAction(self.action_copy) menu.addAction(self.action_move) menu.addSeparator() menu.addAction(self.action_delete) menu.exec_(QContextMenuEvent.globalPos()) def eventFilter(self, obj, event): """ filter events for wheel events Args: obj (QWidget): scroll_area event (QEvent): event """ # try: if event.type() == QEvent.Wheel: if event.angleDelta().y() < 0: self.next_image() else: self.previous_image() return True elif event.type() == QEvent.MouseButtonPress and event.button( ) == Qt.RightButton: index = self.image_gallery.select_row_pos() if index > -1: self.index = index self.display_image() return True # pass the event on to the parent class return super(QMainWindow, self).eventFilter(obj, event) def keyPressEvent(self, event): key = event.key() if key == Qt.Key_Delete: self.delete() elif key == Qt.Key_Left: self.previous_image() elif key == Qt.Key_Right: self.next_image() elif key == Qt.Key_PageUp: self.first_image() elif key == Qt.Key_PageDown: self.last_image() elif key == Qt.Key_Escape and self.isFullScreen(): self.fullscreen() else: QWidget.keyPressEvent(self, event) def mouseDoubleClickEvent(self, QMouseEvent): self.fullscreen() def mousePressEvent(self, QMouseEvent): self.mouse_position = QMouseEvent.pos() def mouseMoveEvent(self, QMouseEvent): diff = QPoint(QMouseEvent.pos() - self.mouse_position) self.mouse_position = QMouseEvent.pos() self.scroll_area.verticalScrollBar().setValue( self.scroll_area.verticalScrollBar().value() - diff.y()) self.scroll_area.horizontalScrollBar().setValue( self.scroll_area.horizontalScrollBar().value() - diff.x()) def resizeEvent(self, event): if not self.index == -1: self.display_image() def create_images(self, filename): """Create image list Args: filename (string): file from which to retrieve the list of images in the folder """ self.images.clear() # get images only with an allowed extension for ext in self.extensions: self.images += glob.glob( os.path.join( glob.escape(os.path.dirname(filename)), '*.' + ''.join('[%s%s]' % (e.lower(), e.upper()) for e in ext))) self.images.sort() if filename in self.images: self.index = self.images.index(filename) else: self.index = -1 # iamge list self.image_gallery.add_images(self.images) def remove_index(self): """ remove file from list images and display next or previous image """ del self.images[self.index] self.image_gallery.remove_row(self.index) if len(self.images) == 0: self.images.clear() self.index = -1 self.image.clear() self.image.resize(self.image.minimumSizeHint()) elif self.index < len(self.images) - 1: self.display_image() else: self.index = len(self.images) - 1 self.display_image() def display_image(self): if not self.index == -1: self.image.clear() self.image.resize(self.image.minimumSizeHint()) file = self.images[self.index] if os.path.isfile(file): self.label_name.setText(file) self.label_numero.setText( str(self.index + 1) + ' / ' + str(len(self.images))) # image list self.image_gallery.select_row(self.index) image_reader = QImageReader(file) if image_reader.imageCount() > 1: # Animated image movie = QMovie(file) movie.setCacheMode(QMovie.CacheAll) movie.jumpToFrame(0) movie_size = movie.currentPixmap().size() self.image.setMovie(movie) self.image.resize(movie_size) movie.start() else: self.image.setPixmap(QPixmap(file)) self.image.resize(self.image.pixmap().size()) # fit image if self.action_fit_screen.isChecked(): self.fit_screen() elif self.action_fit_horizontal.isChecked(): self.fit_width() elif self.action_fit_vertical.isChecked(): self.fit_height() else: self.ratio = 1.0 self.action_zoom_in.setEnabled(True) self.action_zoom_out.setEnabled(True) # scrollbar position self.scroll_area.verticalScrollBar().setSliderPosition(0) self.scroll_area.horizontalScrollBar().setSliderPosition(0) def resize_image(self): if self.action_fit_screen.isChecked(): self.fit_screen() elif self.action_fit_horizontal.isChecked(): self.fit_width() elif self.action_fit_vertical.isChecked(): self.fit_height() elif self.image.pixmap(): self.image.resize(self.ratio * self.image.pixmap().size()) elif movie := self.image.movie(): movie.jumpToFrame(0) movie_size = movie.currentPixmap().size() self.image.resize(self.ratio * movie_size)
class MainWindow(QMainWindow): def __init__(self): super().__init__() ## declared variables self.dir_path = "None selected" self.filelist = ["Select Folder"] self.filelistindex = None self.setWindowTitle("Ephys-Quick Analysis") layout = QGridLayout() toolbar = QToolBar("Function toolbar") self.addToolBar(toolbar) self.folderbuttonsetup() toolbar.addAction(self.folderbutton) self.setStatusBar(QStatusBar(self)) self.filebox = QComboBox() self.filebox.addItems(self.filelist) layout.addWidget(self.filebox, 0, 0, 1, 2) self.tracelabel = QLabel("Sweep number :") layout.addWidget(self.tracelabel, 0, 2) self.sweepslider = QSpinBox() self.sweepslider.setMinimum(0) self.sweepslider.setSingleStep(1) layout.addWidget(self.sweepslider, 0, 3, 1, 2) self.pw = pg.PlotWidget(name='Clamp') ## giving the plots names allows us to link their axes together layout.addWidget(self.pw, 1, 0, 2, 5) self.pw2 = pg.PlotWidget(name='ClampZoom') ## giving the plots names allows us to link their axes together layout.addWidget(self.pw2, 1, 6, 2, 5) self.pw3 = pg.PlotWidget(name='Stim') layout.addWidget(self.pw3, 6, 0, 2, 5) self.pw3.setXLink(self.pw) self.pw4 = pg.PlotWidget(name='StimZoom') layout.addWidget(self.pw4, 6, 6, 2, 5) self.pw4.setXLink(self.pw2) self.pw.setBackground('w') self.pw2.setBackground('w') self.pw3.setBackground('w') self.pw4.setBackground('w') widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) def folderbuttonsetup(self): self.folderbutton = QAction("Folder", self) self.folderbutton.setStatusTip(self.dir_path) self.folderbutton.triggered.connect(self.folderselect) def folderselect(self): print("click") print(self.dir_path) self.dir_path = QFileDialog.getExistingDirectory() self.folderbutton.setStatusTip(self.dir_path) print(self.dir_path) self.fileboxlist() def fileboxlist(self): print('Files within experiment date folder') print('ISOLATING ABF FILES...') self.dir_path_1 = self.dir_path[2:] + "/" self.fileinfolder = os.listdir(self.dir_path_1) self.abffiles = [extension for extension in self.fileinfolder if re.search("\.abf$", extension)] self.abffiles.sort() print('*.abf files in folder:') print(self.abffiles) self.filebox.clear() self.filebox.currentTextChanged.connect(self.fileselected) self.filelist = self.abffiles self.filebox.addItems(self.filelist) def fileselected(self, s): print("yo") print(s) self.fileselected_1 = self.dir_path_1 + s print(self.fileselected_1) self.pw.clear() self.pw2.clear() self.pw3.clear() self.pw4.clear() self.loadabf(self.fileselected_1) def loadabf(self, filetoload): print("load file") self.abf = pyabf.ABF(filetoload) self.numsweep = self.abf.sweepCount - 1 self.sweepslider.cleanText() self.sweepslider.setMaximum(self.numsweep) self.sweepslider.valueChanged.connect(self.setsweep) self.pw.setLabel('left', self.abf.sweepLabelY) self.pw.setLabel('bottom', self.abf.sweepLabelX) self.pw2.setLabel('left', self.abf.sweepLabelY) self.pw2.setLabel('bottom', self.abf.sweepLabelX) self.pw3.setLabel('left', self.abf.sweepLabelY) self.pw3.setLabel('bottom', self.abf.sweepLabelX) self.pw4.setLabel('left', self.abf.sweepLabelY) self.pw4.setLabel('bottom', self.abf.sweepLabelX) self.zoomarea = pg.LinearRegionItem([0, 1]) self.zoomarea.setZValue(-10) self.pw.addItem(self.zoomarea) for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=0) self.pw.plot(self.abf.sweepX, self.abf.sweepY, pen=pg.mkPen('black', width=1)) for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=1) self.pw3.plot(self.abf.sweepX, self.abf.sweepC, pen=pg.mkPen('black', width=1)) for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=0) self.pw2.plot(self.abf.sweepX, self.abf.sweepY, pen=pg.mkPen('black', width=1)) for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=1) self.pw4.plot(self.abf.sweepX, self.abf.sweepC, pen=pg.mkPen('black', width=1)) def updatePlot(): self.pw2.setXRange(*self.zoomarea.getRegion(), padding=0) def updateRegion(): self.zoomarea.setRegion(self.pw2.getViewBox().viewRange()[0]) self.zoomarea.sigRegionChanged.connect(updatePlot) self.pw2.sigXRangeChanged.connect(updateRegion) updatePlot() self.currenttrace = self.pw.plot() self.currenttrace.setPen(pg.mkPen('r', width=2.5)) self.currenttrace2 = self.pw2.plot() self.currenttrace2.setPen(pg.mkPen('r', width=2.5)) self.currenttrace3 = self.pw3.plot() self.currenttrace3.setPen(pg.mkPen('r', width=2.5)) self.currenttrace4 = self.pw4.plot() self.currenttrace4.setPen(pg.mkPen('r', width=2.5)) def setsweep(self, numofsweep): print(numofsweep) self.currenttrace.clear() self.currenttrace2.clear() self.currenttrace3.clear() self.currenttrace4.clear() for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=0) if sweepnum == numofsweep: self.currenttrace.setData(self.abf.sweepX, self.abf.sweepY) for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=1) if sweepnum == numofsweep: self.currenttrace3.setData(self.abf.sweepX, self.abf.sweepC) for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=0) if sweepnum == numofsweep: self.currenttrace2.setData(self.abf.sweepX, self.abf.sweepY) for sweepnum in self.abf.sweepList: self.abf.setSweep(sweepnum, channel=1) if sweepnum == numofsweep: self.currenttrace4.setData(self.abf.sweepX, self.abf.sweepC)