def load_widgets(self, widgets, parent=None): for w in widgets: if isinstance(w, base_widgets.BaseRigToolBoxWidget): w.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) w.emitInfo.connect(self._on_show_success) w.emitError.connect(self._on_show_error) dock_widget = dock.DockWidget(w.title, parent=parent or self) info_button = QToolButton(parent=parent or self) info_button.setCheckable(True) info_button.setChecked(True) info_button.setIcon(resources.icon('info', theme='color')) if hasattr(w, '_on_toggle_info'): info_button.toggled.connect(w._on_toggle_info) dock_widget.add_button(info_button) else: dock_widget = dock.DockWidget(w.objectName(), parent=parent or self) dock_widget.setWidget(w) self._base_window.addDockWidget(Qt.TopDockWidgetArea, dock_widget)
class DockTitleBar(QWidget, object): def __init__(self, dock_widget, renamable=False): super(DockTitleBar, self).__init__(dock_widget) self._renamable = renamable main_layout = QHBoxLayout() main_layout.setContentsMargins(0, 0, 0, 1) self.setLayout(main_layout) self._buttons_box = QGroupBox('') self._buttons_box.setObjectName('Docked') self._buttons_layout = QHBoxLayout() self._buttons_layout.setSpacing(1) self._buttons_layout.setMargin(2) self._buttons_box.setLayout(self._buttons_layout) main_layout.addWidget(self._buttons_box) self._title_label = QLabel(self) self._title_label.setStyleSheet('background: transparent') self._title_edit = QLineEdit(self) self._title_edit.setVisible(False) self._button_size = QSize(14, 14) self._dock_btn = QToolButton(self) self._dock_btn.setIcon(resources.icon('restore_window', theme='color')) self._dock_btn.setMaximumSize(self._button_size) self._dock_btn.setAutoRaise(True) self._close_btn = QToolButton(self) self._close_btn.setIcon(resources.icon('close_window', theme='color')) self._close_btn.setMaximumSize(self._button_size) self._close_btn.setAutoRaise(True) self._buttons_layout.addSpacing(2) self._buttons_layout.addWidget(self._title_label) self._buttons_layout.addWidget(self._title_edit) self._buttons_layout.addStretch() self._buttons_layout.addSpacing(5) self._buttons_layout.addWidget(self._dock_btn) self._buttons_layout.addWidget(self._close_btn) self._buttons_box.mouseDoubleClickEvent = self.mouseDoubleClickEvent self._buttons_box.mousePressEvent = self.mousePressEvent self._buttons_box.mouseMoveEvent = self.mouseMoveEvent self._buttons_box.mouseReleaseEvent = self.mouseReleaseEvent dock_widget.featuresChanged.connect(self._on_dock_features_changed) self._title_edit.editingFinished.connect(self._on_finish_edit) self._dock_btn.clicked.connect(self._on_dock_btn_clicked) self._close_btn.clicked.connect(self._on_close_btn_clicked) self._on_dock_features_changed(dock_widget.features()) self.set_title(dock_widget.windowTitle()) dock_widget.installEventFilter(self) dock_widget.topLevelChanged.connect(self._on_change_floating_style) @property def renamable(self): return self._renamable @renamable.setter def renamable(self, flag): self._renamable = flag def eventFilter(self, obj, event): if event.type() == QEvent.WindowTitleChange: self.set_title(obj.windowTitle()) return super(DockTitleBar, self).eventFilter(obj, event) def mouseMoveEvent(self, event): event.ignore() def mousePressEvent(self, event): event.ignore() def mouseReleaseEvent(self, event): event.ignore() def mouseDoubleClickEvent(self, event): if event.pos().x() <= self._title_label.width() and self._renamable: self._start_edit() else: super(DockTitleBar, self).mouseDoubleClickEvent(event) def update(self, *args, **kwargs): self._on_change_floating_style(self.parent().isFloating()) super(DockTitleBar, self).update(*args, **kwargs) def set_title(self, title): self._title_label.setText(title) self._title_edit.setText(title) def add_button(self, button): button.setAutoRaise(True) button.setMaximumSize(self._button_size) self._buttons_layout.insertWidget(5, button) def _start_edit(self): self._title_label.hide() self._title_edit.show() self._title_edit.setFocus() def _finish_edit(self): self._title_edit.hide() self._title_label.show() self.parent().setWindowTitle(self._title_edit.text()) def _on_dock_features_changed(self, features): if not features & QDockWidget.DockWidgetVerticalTitleBar: self._close_btn.setVisible(features & QDockWidget.DockWidgetClosable) self._dock_btn.setVisible(features & QDockWidget.DockWidgetFloatable) else: raise ValueError('Vertical title bar is not supported!') def _on_finish_edit(self): self._finish_edit() def _on_dock_btn_clicked(self): self.parent().setFloating(not self.parent().isFloating()) def _on_close_btn_clicked(self): self.parent().toggleViewAction().setChecked(False) self.parent().close() def _on_change_floating_style(self, state): pass
def _build_ui(self): layout = QGridLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.tree = QTreeWidget() self.tree.setSelectionMode(QTreeWidget.ExtendedSelection) self.tree.setHeaderLabels([ "name", "status", "server", "prioritize", "kill", "delete", "browse" ]) self.tree.setUniformRowHeights(True) self.tree.setColumnWidth(0, 150) layout.addWidget(self.tree, 0, 0, 6, 1, Qt.AlignTop) row = 0 pause_button = QPushButton( "pause new jobs" if not self.session.seqcrow_job_manager.paused else "resume jobs") pause_button.setCheckable(True) pause_button.clicked.connect(lambda check: pause_button.setText( "pause new jobs" if not check else "resume jobs")) pause_button.setChecked(self.session.seqcrow_job_manager.paused) pause_button.clicked.connect(self.pause_queue) layout.addWidget(pause_button, row, 1, 1, 1, Qt.AlignTop) row += 1 open_button = QPushButton("open structure") open_button.clicked.connect(self.open_jobs) layout.addWidget(open_button, row, 1, 1, 1, Qt.AlignTop) row += 1 log_button = QPushButton("log") log_button.clicked.connect(self.open_log) layout.addWidget(log_button, row, 1, 1, 1, Qt.AlignTop) row += 1 output_button = QPushButton("raw output") output_button.clicked.connect(self.open_output) layout.addWidget(output_button, row, 1, 1, 1, Qt.AlignTop) row += 1 refresh_button = QToolButton() refresh_button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.MinimumExpanding) refresh_button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) refresh_button.setIcon( QIcon(refresh_button.style().standardIcon( QStyle.SP_BrowserReload))) refresh_button.setText('check jobs') refresh_button.clicked.connect( lambda *args: self.session.seqcrow_job_manager.triggers. activate_trigger(JOB_QUEUED, "refresh")) layout.addWidget(refresh_button, row, 1, 1, 1, Qt.AlignTop) row += 1 for i in range(0, row - 1): layout.setRowStretch(i, 0) layout.setRowStretch(row - 1, 1) layout.setColumnStretch(0, 1) layout.setColumnStretch(1, 0) self.tool_window.ui_area.setLayout(layout) self.tool_window.manage(None)
class LoadWidget(BaseLoadWidget, object): HISTORY_WIDGET = history.HistoryFileWidget OPTIONS_WIDGET = None def __init__(self, item, parent=None): self._icon_path = '' self._script_job = None self._options_widget = None super(LoadWidget, self).__init__(item, parent=parent) self.load_settings() self.create_sequence_widget() self.update_thumbnail_size() def ui(self): super(LoadWidget, self).ui() tabs_widget = tabs.BaseTabWidget(parent=self) info_widget = QWidget() info_layout = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) info_widget.setLayout(info_layout) if self.OPTIONS_WIDGET: self._options_widget = self.OPTIONS_WIDGET(parent=self) title_layout = layouts.HorizontalLayout(spacing=1, margins=(1, 1, 0, 0)) self._icon_lbl = label.BaseLabel('', parent=self) self._icon_lbl.setMaximumSize(QSize(14, 14)) self._icon_lbl.setMinimumSize(QSize(14, 14)) self._icon_lbl.setScaledContents(True) self._title_lbl = label.BaseLabel('Title', parent=self) title_layout.addWidget(self._icon_lbl) title_layout.addWidget(self._title_lbl) icon_toggle_box = QFrame() icon_toggle_box.setFrameShape(QFrame.NoFrame) icon_toggle_box.setFrameShadow(QFrame.Plain) icon_toggle_box_lyt = layouts.VerticalLayout(spacing=1, margins=(0, 1, 0, 0)) icon_toggle_box.setLayout(icon_toggle_box_lyt) icon_toggle_box_header = QFrame() icon_toggle_box_header.setFrameShape(QFrame.NoFrame) icon_toggle_box_header.setFrameShadow(QFrame.Plain) icon_toggle_box_header_lyt = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) icon_toggle_box_header.setLayout(icon_toggle_box_header_lyt) self._icon_toggle_box_btn = buttons.BaseButton('ICON', parent=self) self._icon_toggle_box_btn.setObjectName('iconButton') self._icon_toggle_box_btn.setCheckable(True) self._icon_toggle_box_btn.setChecked(True) icon_toggle_box_header_lyt.addWidget(self._icon_toggle_box_btn) self._icon_toggle_box_frame = QFrame() self._icon_toggle_box_frame.setFrameShape(QFrame.NoFrame) self._icon_toggle_box_frame.setFrameShadow(QFrame.Plain) icon_toggle_box_frame_lyt = layouts.VerticalLayout(spacing=1, margins=(0, 1, 0, 0)) self._icon_toggle_box_frame.setLayout(icon_toggle_box_frame_lyt) thumbnail_layout = layouts.HorizontalLayout(spacing=0, margins=(0, 0, 0, 0)) icon_toggle_box_frame_lyt.addLayout(thumbnail_layout) thumbnail_frame_layout = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) self._thumbnail_frame = QFrame() self._thumbnail_frame.setFrameShape(QFrame.NoFrame) self._thumbnail_frame.setFrameShadow(QFrame.Plain) self._thumbnail_frame.setLayout(thumbnail_frame_layout) thumbnail_layout.addWidget(self._thumbnail_frame) self._thumbnail_btn = QToolButton() self._thumbnail_btn.setObjectName('thumbnailButton') self._thumbnail_btn.setMinimumSize(QSize(0, 0)) self._thumbnail_btn.setMaximumSize(QSize(150, 150)) self._thumbnail_btn.setStyleSheet( 'color: rgb(40, 40, 40);\nborder: 1px solid rgb(0, 0, 0, 0);\nbackground-color: rgb(254, 255, 230, 0);' ) self._thumbnail_btn.setLayoutDirection(Qt.LeftToRight) self._thumbnail_btn.setText('Snapshot') self._thumbnail_btn.setIcon(resources.icon('thumbnail')) thumbnail_frame_layout.addWidget(self._thumbnail_btn) icon_toggle_box_lyt.addWidget(icon_toggle_box_header) icon_toggle_box_lyt.addWidget(self._icon_toggle_box_frame) info_toggle_box = QFrame() info_toggle_box.setFrameShape(QFrame.NoFrame) info_toggle_box.setFrameShadow(QFrame.Plain) info_toggle_box_lyt = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) info_toggle_box.setLayout(info_toggle_box_lyt) info_toggle_box_header = QFrame() info_toggle_box_header.setFrameShape(QFrame.NoFrame) info_toggle_box_header.setFrameShadow(QFrame.Plain) info_toggle_box_header_lyt = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) info_toggle_box_header.setLayout(info_toggle_box_header_lyt) self._info_toggle_box_btn = buttons.BaseButton('INFO', parent=self) self._info_toggle_box_btn.setObjectName('infoButton') self._info_toggle_box_btn.setCheckable(True) self._info_toggle_box_btn.setChecked(True) info_toggle_box_header_lyt.addWidget(self._info_toggle_box_btn) self._info_toggle_box_frame = QFrame() self._info_toggle_box_frame.setFrameShape(QFrame.NoFrame) self._info_toggle_box_frame.setFrameShadow(QFrame.Plain) info_toggle_box_frame_lyt = layouts.VerticalLayout(spacing=1, margins=(0, 1, 0, 0)) self._info_toggle_box_frame.setLayout(info_toggle_box_frame_lyt) self._info_frame = QFrame() self._info_frame.setFrameShape(QFrame.NoFrame) self._info_frame.setFrameShadow(QFrame.Plain) info_frame_lyt = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) self._info_frame.setLayout(info_frame_lyt) info_toggle_box_frame_lyt.addWidget(self._info_frame) info_toggle_box_lyt.addWidget(info_toggle_box_header) info_toggle_box_lyt.addWidget(self._info_toggle_box_frame) version_toggle_box = QFrame() version_toggle_box.setFrameShape(QFrame.NoFrame) version_toggle_box.setFrameShadow(QFrame.Plain) version_toggle_box_lyt = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) version_toggle_box.setLayout(version_toggle_box_lyt) version_toggle_box_header = QFrame() version_toggle_box_header.setFrameShape(QFrame.NoFrame) version_toggle_box_header.setFrameShadow(QFrame.Plain) version_toggle_box_header_lyt = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) version_toggle_box_header.setLayout(version_toggle_box_header_lyt) self._version_toggle_box_btn = buttons.BaseButton('VERSION', parent=self) self._version_toggle_box_btn.setObjectName('versionButton') self._version_toggle_box_btn.setCheckable(True) self._version_toggle_box_btn.setChecked(True) version_toggle_box_header_lyt.addWidget(self._version_toggle_box_btn) self._version_toggle_box_frame = QFrame() self._version_toggle_box_frame.setFrameShape(QFrame.NoFrame) self._version_toggle_box_frame.setFrameShadow(QFrame.Plain) version_toggle_box_frame_lyt = layouts.VerticalLayout(spacing=1, margins=(0, 1, 0, 0)) self._version_toggle_box_frame.setLayout(version_toggle_box_frame_lyt) self._version_frame = QFrame() self._version_frame.setFrameShape(QFrame.NoFrame) self._version_frame.setFrameShadow(QFrame.Plain) version_frame_lyt = layouts.VerticalLayout(spacing=0, margins=(0, 0, 0, 0)) self._version_frame.setLayout(version_frame_lyt) version_toggle_box_frame_lyt.addWidget(self._version_frame) self._history_widget = self.HISTORY_WIDGET() version_frame_lyt.addWidget(self._history_widget) version_toggle_box_lyt.addWidget(version_toggle_box_header) version_toggle_box_lyt.addWidget(self._version_toggle_box_frame) preview_buttons_frame = QFrame() preview_buttons_frame.setObjectName('previewButtons') preview_buttons_frame.setFrameShape(QFrame.NoFrame) preview_buttons_frame.setFrameShadow(QFrame.Plain) self._preview_buttons_frame_lyt = layouts.VerticalLayout(spacing=0, margins=(2, 2, 2, 2)) self._preview_buttons_lyt = layouts.HorizontalLayout(spacing=2, margins=(0, 0, 0, 0)) self._load_btn = buttons.BaseButton('Load', parent=self) self._load_btn.setObjectName('loadButton') self._load_btn.setMinimumSize(QSize(60, 35)) self._load_btn.setMaximumSize(QSize(125, 35)) self._preview_buttons_frame_lyt.addStretch() self._preview_buttons_frame_lyt.addLayout(self._preview_buttons_lyt) self._preview_buttons_frame_lyt.addStretch() self._preview_buttons_lyt.addWidget(self._load_btn) preview_buttons_frame.setLayout(self._preview_buttons_frame_lyt) info_layout.addLayout(title_layout) info_layout.addWidget(icon_toggle_box) info_layout.addWidget(info_toggle_box) info_layout.addWidget(version_toggle_box) tabs_widget.addTab(info_widget, 'Info') if self._options_widget: tabs_widget.addTab(self._options_widget, 'Options') self.main_layout.addWidget(tabs_widget) self.main_layout.addWidget(dividers.Divider()) self.main_layout.addWidget(preview_buttons_frame) self.main_layout.addItem( QSpacerItem(0, 250, QSizePolicy.Preferred, QSizePolicy.Expanding)) def setup_signals(self): self._info_toggle_box_btn.clicked.connect(self.save_settings) self._info_toggle_box_btn.toggled[bool].connect( self._info_toggle_box_frame.setVisible) self._icon_toggle_box_btn.clicked.connect(self.save_settings) self._icon_toggle_box_btn.toggled[bool].connect( self._icon_toggle_box_frame.setVisible) self._version_toggle_box_btn.clicked.connect(self.save_settings) self._version_toggle_box_btn.toggled[bool].connect( self._version_toggle_box_frame.setVisible) self._load_btn.clicked.connect(self.load) def resizeEvent(self, event): """ Function that overrides base.BaseWidget function :param event: QSizeEvent """ self.update_thumbnail_size() def set_item(self, item): """ Sets the library item to load :param item: LibraryItem """ super(LoadWidget, self).set_item(item) self._title_lbl.setText(item.MenuName) self._icon_lbl.setPixmap(QPixmap(item.type_icon_path())) info_widget = formwidget.FormWidget(self) info_widget.set_schema(item.info()) self._info_frame.layout().addWidget(info_widget) self.refresh() def load_btn(self): """ Returns button that loads the data :return: QPushButton """ return self._load_btn def icon_path(self): """ Returns the icon path to be used for the thumbnail :return: str """ return self._icon_path def set_icon_path(self, path): """ Sets the icon path to be used for the thumbnail :param path: str """ self._icon_path = path icon = QIcon(QPixmap(path)) self.set_icon(icon) self.update_thumbnail_size() self.item().update() def set_icon(self, icon): """ Sets the icon to be shown for the preview :param icon: QIcon """ self._thumbnail_btn.setIcon(icon) self._thumbnail_btn.setIconSize(QSize(200, 200)) self._thumbnail_btn.setText('') def refresh(self): """ Refreshes load widgetz """ self.update_history() self.update_options() def update_history(self): """ Updates history version of the current selected item """ if not self._item: return data_object = self._item.data_object() if not data_object: return self._history_widget.set_directory(data_object.directory) self._history_widget.refresh() def update_options(self): """ Updates options widget """ if not self._options_widget: return if not self._item: return data_object = self._item.data_object() if not data_object: return self._options_widget.set_data_object(data_object) def is_editable(self): """ Returns whether the user can edit the item or not :return: bool """ item = self.item() editable = True if item and item.library_window(): editable = not item.library_window().is_locked() return editable def create_sequence_widget(self): """ Creates a sequence widget to replace the static thumbnail widget """ self._sequence_widget = widgets.LibraryImageSequenceWidget(self) self._sequence_widget.setStyleSheet(self._thumbnail_btn.styleSheet()) self._sequence_widget.setToolTip(self._thumbnail_btn.toolTip()) self._thumbnail_frame.layout().insertWidget(0, self._sequence_widget) self._thumbnail_btn.hide() self._thumbnail_btn = self._sequence_widget path = self.item().thumbnail_path() if path and os.path.exists(path): self.set_icon_path(path) if self.item().image_sequence_path(): self._sequence_widget.set_dirname( self.item().image_sequence_path()) def update_thumbnail_size(self): """ Updates the thumbnail button to the size of the widget """ width = self.width() - 10 if width > 250: width = 250 size = QSize(width, width) self._thumbnail_btn.setIconSize(size) self._thumbnail_btn.setMaximumSize(size) self._thumbnail_frame.setMaximumSize(size) def settings(self): """ Returns the current state of the widget :return: dict """ settings = dict() settings['iconToggleBoxChecked'] = self._icon_toggle_box_btn.isChecked( ) settings['infoToggleBoxChecked'] = self._info_toggle_box_btn.isChecked( ) settings[ 'versionToggleBoxChecked'] = self._version_toggle_box_btn.isChecked( ) return settings def save_settings(self): pass def load_settings(self): pass def load(self): """ Loads current item """ if not self.item(): return self.item().load_from_current_options()
def init_ui(self, name): self.setFrameStyle(QFrame.Sunken | QFrame.StyledPanel) self.graphicsView = GraphicsView(self) self.graphicsView.setRenderHint(QPainter.Antialiasing, False) self.graphicsView.setDragMode(QGraphicsView.RubberBandDrag) self.graphicsView.setOptimizationFlags(QGraphicsView.DontSavePainterState) self.graphicsView.setViewportUpdateMode(QGraphicsView.SmartViewportUpdate) self.graphicsView.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) size = self.style().pixelMetric(QStyle.PM_ToolBarIconSize) iconSize = QSize(size, size) zoomInIcon = QToolButton() zoomInIcon.setAutoRepeat(True) zoomInIcon.setAutoRepeatInterval(33) zoomInIcon.setAutoRepeatDelay(0) zoomInIcon.setIcon(QIcon(":/zoomin.png")) zoomInIcon.setIconSize(iconSize) zoomOutIcon = QToolButton() zoomOutIcon.setAutoRepeat(True) zoomOutIcon.setAutoRepeatInterval(33) zoomOutIcon.setAutoRepeatDelay(0) zoomOutIcon.setIcon(QIcon(":/zoomout.png")) zoomOutIcon.setIconSize(iconSize) self.zoomSlider = QSlider() self.zoomSlider.setMinimum(0) self.zoomSlider.setMaximum(500) self.zoomSlider.setValue(250) self.zoomSlider.setTickPosition(QSlider.TicksRight) # Zoom slider layout zoomSliderLayout = QVBoxLayout() zoomSliderLayout.addWidget(zoomInIcon) zoomSliderLayout.addWidget(self.zoomSlider) zoomSliderLayout.addWidget(zoomOutIcon) rotateLeftIcon = QToolButton() rotateLeftIcon.setIcon(QIcon(":/rotateleft.png")) rotateLeftIcon.setIconSize(iconSize) rotateRightIcon = QToolButton() rotateRightIcon.setIcon(QIcon(":/rotateright.png")) rotateRightIcon.setIconSize(iconSize) self.rotateSlider = QSlider() self.rotateSlider.setOrientation(Qt.Horizontal) self.rotateSlider.setMinimum(-360) self.rotateSlider.setMaximum(360) self.rotateSlider.setValue(0) self.rotateSlider.setTickPosition(QSlider.TicksBelow) # Rotate slider layout rotateSliderLayout = QHBoxLayout() rotateSliderLayout.addWidget(rotateLeftIcon) rotateSliderLayout.addWidget(self.rotateSlider) rotateSliderLayout.addWidget(rotateRightIcon) self.resetButton = QToolButton() self.resetButton.setText("0") self.resetButton.setEnabled(False) # Label layout labelLayout = QHBoxLayout() self.label = QLabel(name) self.label2 = QLabel("Pointer Mode") self.selectModeButton = QToolButton() self.selectModeButton.setText("Select") self.selectModeButton.setCheckable(True) self.selectModeButton.setChecked(True) self.dragModeButton = QToolButton() self.dragModeButton.setText("Drag") self.dragModeButton.setCheckable(True) self.dragModeButton.setChecked(False) self.antialiasButton = QToolButton() self.antialiasButton.setText("Antialiasing") self.antialiasButton.setCheckable(True) self.antialiasButton.setChecked(False) self.openGlButton = QToolButton() self.openGlButton.setText("OpenGL") self.openGlButton.setCheckable(True) self.openGlButton.setEnabled(QGLFormat.hasOpenGL()) pointerModeGroup = QButtonGroup() pointerModeGroup.setExclusive(True) pointerModeGroup.addButton(self.selectModeButton) pointerModeGroup.addButton(self.dragModeButton) labelLayout.addWidget(self.label) labelLayout.addStretch() labelLayout.addWidget(self.label2) labelLayout.addWidget(self.selectModeButton) labelLayout.addWidget(self.dragModeButton) labelLayout.addStretch() labelLayout.addWidget(self.antialiasButton) labelLayout.addWidget(self.openGlButton) topLayout = QGridLayout() topLayout.addLayout(labelLayout, 0, 0) topLayout.addWidget(self.graphicsView, 1, 0) topLayout.addLayout(zoomSliderLayout, 1, 1) topLayout.addLayout(rotateSliderLayout, 2, 0) topLayout.addWidget(self.resetButton, 2, 1) self.setLayout(topLayout) self.resetButton.clicked.connect(self.resetView) self.zoomSlider.valueChanged.connect(self.setupTransform) self.rotateSlider.valueChanged.connect(self.setupTransform) self.graphicsView.verticalScrollBar().valueChanged.connect(self.setResetButtonEnabled) self.graphicsView.horizontalScrollBar().valueChanged.connect(self.setResetButtonEnabled) self.selectModeButton.toggled.connect(self.togglePointerMode) self.dragModeButton.toggled.connect(self.togglePointerMode) self.antialiasButton.toggled.connect(self.toggleAntialiasing) self.openGlButton.toggled.connect(self.toggleOpenGL) rotateLeftIcon.clicked.connect(self.rotateLeft) rotateRightIcon.clicked.connect(self.rotateRight) zoomInIcon.clicked.connect(self.zoomIn) zoomOutIcon.clicked.connect(self.zoomOut) self.setupTransform()