def __init__(self, monitor, *, parent=None): super().__init__(parent=parent) self._edges_removed = [] self.monitor = monitor self.detector = monitor.detector self.monitor.update.connect(self._ports_updated) self.registry = qtpynodeeditor.DataModelRegistry() for ophyd_cls, model in data_model.models.items(): self.registry.register_model(model, category='Area Detector') self.scene = qtpynodeeditor.FlowScene( registry=self.registry, allow_node_deletion=False, allow_node_creation=False) self._connected_by_user = {} self.scene.connection_created.connect(self._user_connected_nodes) self.scene.connection_deleted.connect(self._user_deleted_connection) self.view = qtpynodeeditor.FlowView(self.scene) self.view.setMinimumSize(400, 400) self.layout = QtWidgets.QVBoxLayout() self.dock = QtWidgets.QDockWidget() self.layout.addWidget(self.view) self.setLayout(self.layout) self._nodes = {} self._edges = set() self._auto_position = True
def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags(0), **kwargs): super().__init__(parent, flags, **kwargs) #: main application datamodel (QStandardItemModel) self.datamodel = QtGui.QStandardItemModel(self) # @TODO: custom treeview with "currentChanged" slot re-implemented #: tree view for the main application data model self.treeview = QtWidgets.QTreeView() # @TODO # self.treeview.setSelectionMode(QtWidgets.QTreeView.SingleSelection) self.treeview.setModel(self.datamodel) self.treeview.setEditTriggers( QtWidgets.QAbstractItemView.NoEditTriggers) self.treeview.header().hide() self.treeview.clicked.connect(self.setActiveWinFromIndex) self.mdiarea.subWindowActivated.connect(self.setActiveIndexFromWin) self.datamodel.rowsAboutToBeRemoved.connect(self.onItemsClosed) # setup the treeview dock treeviewdock = QtWidgets.QDockWidget(self.tr('Data Browser'), self) treeviewdock.setWidget(self.treeview) treeviewdock.setObjectName('TreeViewPanel') self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, treeviewdock)
def init_UI(self): self.file_dock = QtWidgets.QDockWidget(u'File List') self.file_dock.setObjectName(u'Files') self.file_dock.setStyleSheet( "QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif; }" ) self.fileSearch = QtWidgets.QLineEdit() self.fileSearch.setPlaceholderText('Search Filename') self.fileSearch.textChanged.connect(self.fileSearchChanged) self.fileListWidget = QtWidgets.QListWidget() self.fileListWidget.itemClicked.connect(self.fileItemClicked) self.fileListWidget.itemSelectionChanged.connect( self.fileSelectionChanged) self.fileListLayout = QtWidgets.QVBoxLayout() self.fileListLayout.setContentsMargins(0, 0, 0, 0) self.fileListLayout.setSpacing(0) self.fileListLayout.addWidget(self.fileSearch) self.fileListLayout.addWidget(self.fileListWidget) fileListWidget = QtWidgets.QWidget() fileListWidget.setLayout(self.fileListLayout) self.file_dock.setWidget(fileListWidget)
def create_console(self): # We could inherit QAction, and have it reroute when it triggers, # and then drop route when it finishes, however this will not catch # interactive dialogs and such. c = self._get_console_config() self.settings.set_default('console_completion_type', 'droplist') valid_completions = ConsoleWidget.gui_completion.values self.settings.set_enum_hint('console_completion_type', valid_completions) gui_completion = self.settings['console_completion_type'] if gui_completion not in valid_completions: gui_completion = 'droplist' control = ConsoleWidget(config=c, gui_completion=gui_completion) control.executing.connect(self.on_console_executing) control.executed.connect(self.on_console_executed) # This is where we push variables to the console ex = self._get_console_exec() push = self._get_console_exports() control.ex(ex) control.push(push) self.console = control self._console_dock = QtWidgets.QDockWidget("Console") self._console_dock.setObjectName('console_widget') self._console_dock.setWidget(control) self.addDockWidget(Qt.BottomDockWidgetArea, self._console_dock)
def add_widget(self, widget, floating=None): """ Add the passed 'widget' to the main window. If the widget is not a QDockWidget, it will be wrapped into one. The QDockWidget is returned. The widget is also added to the window menu self.windowmenu, so that it's visibility can be toggled. The parameter 'floating' specifies whether the widget should be made floating. If None, the value of the setting 'default_widget_floating' is used. """ if floating is None: floating = self.settings['default_widget_floating', bool] if isinstance(widget, QtWidgets.QDockWidget): d = widget else: d = QtWidgets.QDockWidget(self) d.setWidget(widget) d.setWindowTitle(widget.windowTitle()) if not d.objectName(): d.setObjectName(d.windowTitle()) d.setAllowedAreas(Qt.RightDockWidgetArea | Qt.LeftDockWidgetArea) self.addDockWidget(Qt.RightDockWidgetArea, d) d.setFloating(floating) self.widgets.append(widget) # Insert widgets in Windows menu before separator (figures are after) self.windowmenu.insertAction(self.windowmenu_sep, d.toggleViewAction()) return d
def init_UI(self): self.inference_dock = QtWidgets.QDockWidget('Defect Inference Result') self.inference_dock.setObjectName('Flags') self.inference_dock.setStyleSheet("QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif;}") self.lb_result = QtWidgets.QLabel() self.lb_result.setAlignment(Qt.AlignCenter) self.lb_result.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) self.lb_result.setAcceptDrops(True) self.lb_result.rotation = 0 self.lb_result.rotate = False self.lb_result.resize(1040, 780) self.scrollArea = QtWidgets.QScrollArea() self.scrollArea.setWidget(self.lb_result) self.lb_result_value = QtWidgets.QPlainTextEdit() self.lb_result_value.move(80, 20) self.lb_result_value.setMaximumSize(2000, 80) self.lb_result_value.setReadOnly(True) self.ResultListLayout = QtWidgets.QVBoxLayout() self.ResultListLayout.setContentsMargins(0, 0, 0, 0) self.ResultListLayout.setSpacing(0) self.ResultListLayout.addWidget(self.lb_result_value) self.ResultListLayout.addWidget(self.scrollArea) self.ReulstListWidget = QtWidgets.QWidget() self.ReulstListWidget.setLayout(self.ResultListLayout) self.inference_dock.setWidget(self.ReulstListWidget)
def createHelpWindow(self): # http://www.walletfox.com/course/qhelpengineexample.php help_path = (Path(__file__).parent / 'TimeView.qhc').resolve() assert help_path.exists() help_engine = QtHelp.QHelpEngine(str(help_path)) help_engine.setupData() tab_widget = QtWidgets.QTabWidget() tab_widget.setMaximumWidth(400) tab_widget.addTab(help_engine.contentWidget(), "Contents") tab_widget.addTab(help_engine.indexWidget(), "Index") text_viewer = HelpBrowser(help_engine) url = "qthelp://org.sphinx.timeview.1.0/doc/index.html" text_viewer.setSource(QtCore.QUrl(url)) help_engine.contentWidget()\ .linkActivated['QUrl'].connect(text_viewer.setSource) help_engine.indexWidget()\ .linkActivated['QUrl', str].connect(text_viewer.setSource) horiz_splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) horiz_splitter.insertWidget(0, tab_widget) horiz_splitter.insertWidget(1, text_viewer) help_window = QtWidgets.QDockWidget('Help', self) help_window.setWidget(horiz_splitter) help_window.hide() self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, help_window) return help_window
def init_UI(self): self.defect_dock = QtWidgets.QDockWidget('Defect Crop Image') self.defect_dock.setObjectName('Defect Crop Image') self.defect_dock.setStyleSheet( "QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif;}" ) self.defect = defect_info.Defect() self.defect_widget = DefectWindow(self.defect)
def _toggleTool(self, ctrl: ToolController, action=None): if ctrl.name not in self.active_tools: dock = QtWidgets.QDockWidget(ctrl.item_config.title) content = ctrl.view dock.setWidget(content) self._setCloseAction(action, content, dock, ctrl.name) self.addDockWidget(ctrl.item_config.orientation, dock) self.active_tools[ctrl.name] = dock else: self.active_tools.pop(ctrl.name).close()
def init_UI(self): self.uniqLabelList = EscapableQListWidget() self.property_dock = QtWidgets.QDockWidget(u'Source Image Properties') self.property_dock.setObjectName(u'Source Image Properties') self.property_dock.setStyleSheet( "QDockWidget {font-size: 11pt; font-weight: bold; font-family:Sans Serif;}" ) self.property_dock.setWidget(self.uniqLabelList) self.extract = extract_exif.Extract()
def create_dock(title, parent, stretch=True): """Create a dock widget and set it up accordingly.""" dock = QtWidgets.QDockWidget(parent) dock.setWindowTitle(title) dock.setObjectName(title) titlebar = DockTitleBarWidget(dock, title, stretch=stretch) dock.setTitleBarWidget(titlebar) if hasattr(parent, 'dockwidgets'): parent.dockwidgets.append(dock) return dock
def createDock(self, widget, dockName, dockTitle, widgetArea, isMova): # 停靠窗口2 dock = QtWidgets.QDockWidget(dockTitle) dock.setWidget(widget) dock.setObjectName(dockName) if isMova: dock.setFeatures(dock.DockWidgetFloatable | dock.DockWidgetMovable | QDockWidget.AllDockWidgetFeatures) else: dock.setFeatures(dock.DockWidgetFloatable) self.addDockWidget(widgetArea, dock)
def addDock(self, widget, name): # add widget self.widgets.append(widget) # make an empty dock for widget self.docks.append(QtWidgets.QDockWidget(name)) # add widget to dock self.docks[-1].setWidget(self.widgets[-1]) # add dock to view self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.docks[-1]) # set layout self.widgets[-1].setLayout(self.widgets[-1].getLayout())
def create_dock(title, parent, stretch=True, widget=None, fn=None): """Create a dock widget and set it up accordingly.""" dock = QtWidgets.QDockWidget(parent) dock.setWindowTitle(title) dock.setObjectName(title) titlebar = DockTitleBarWidget(dock, title, stretch=stretch) dock.setTitleBarWidget(titlebar) dock.setAutoFillBackground(True) if hasattr(parent, 'dockwidgets'): parent.dockwidgets.append(dock) if fn: widget = fn(dock) if widget: dock.setWidget(widget) return dock
def __init__(self, detector, *, parent=None): super().__init__(parent=parent) self._device_widgets = {} self._interface_ready = threading.Event() self.detector = detector self.setWindowTitle(f'adviewer - {self.detector.name}') self.monitor = PortGraphMonitor(detector, parent=self) self.chart = PortGraphFlowchart(self.monitor) self.tree = PortTreeWidget(self.monitor) self.info_label = QtWidgets.QLabel() self.loop = asyncio.get_event_loop() self.setCentralWidget(self.chart.view) self.tree_dock = QtWidgets.QDockWidget('Port &Tree') self.tree_dock.setWidget(self.tree) self.info_dock = QtWidgets.QDockWidget('Port &Info') self.info_dock.setWidget(self.info_label) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.tree_dock) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.info_dock) self.chart.scene.node_hovered.connect(self._user_node_hovered) self.chart.flowchart_updated.connect(self.tree.update) self.tree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.tree.customContextMenuRequested.connect( self._tree_context_menu) self.chart.scene.node_context_menu.connect( self._node_context_menu) self.tree.port_selected.connect(self._tree_port_selected) threading.Thread(target=self._startup).start()
def setup_logger_window(self): # Put the logging console in the bottom region of the window self.logger_dock = QtWidgets.QDockWidget('Log') self.logger_dock.setObjectName('LoggerDockWidget') self.logger_dock.setFeatures( QtWidgets.QDockWidget.DockWidgetClosable | QtWidgets.QDockWidget.DockWidgetMovable | QtWidgets.QDockWidget.DockWidgetFloatable) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.logger_dock) self.logger = logger.Logger(self) self.logger.setObjectName('LoggerWidget') self.logger_dock.setWidget(self.logger) # add self.logger as handler of main logger object vitables_logger = logging.getLogger('vitables') stream_handler = logging.StreamHandler(self.logger) stream_handler.setFormatter(logging.Formatter(_GUI_LOG_FORMAT)) vitables_logger.addHandler(stream_handler)
def init(app): import logging from qtpy import QtCore, QtWidgets from exectools.qt import QtOutputPane, QtLoggingHandler panel = QtWidgets.QDockWidget('Output Log', app, objectName='outputPanel') # @TODO: try to add actions to a QTextEdit widget instead of using a # custom widget logpane = QtOutputPane() panel.setWidget(logpane) app.addDockWidget(QtCore.Qt.BottomDockWidgetArea, panel) # setupLogger formatter = logging.Formatter('%(levelname)s: %(message)s') handler = QtLoggingHandler(logpane) handler.setFormatter(formatter) app.logger.addHandler(handler) # Connect signals logpane.paneHideRequest.connect(panel.hide)
def addViewerController(self, viewer_ctrl): self._model.addViewerCtrl(viewer_ctrl) wrapper = QtWidgets.QDockWidget("{}: {}".format( viewer_ctrl.v_id, viewer_ctrl.getTitle())) wrapper.setWidget(viewer_ctrl.view) wrapper.setFocusPolicy(QtCore.Qt.ClickFocus) wrapper.focusInEvent = lambda x, v=viewer_ctrl.v_id, dock=wrapper: self._onViewerChanged( v, dock) wrapper.closeEvent = lambda evt, v=viewer_ctrl.v_id: self._onTabClosed( v) wrapper.setFeatures(QtWidgets.QDockWidget.DockWidgetVerticalTitleBar | QtWidgets.QDockWidget.DockWidgetClosable | QtWidgets.QDockWidget.DockWidgetFloatable | QtWidgets.QDockWidget.DockWidgetMovable) wrapper.setMinimumSize(300, 300) self._view.addDockWidget(self._getDefaultDockArea(), wrapper) self._tabify(wrapper) self._model.addTab(viewer_ctrl.v_id, wrapper) self._onViewerAdded(viewer_ctrl) wrapper.setFocus() # triggers _onViewerChanged
def __init__(self, path = None): super(Viewer, self).__init__() self.setWindowTitle("pydiq - Python DICOM Viewer in Qt") self.file = None self._file_name = None self.high_hu = 2000 self.low_hu = -1024 # self.pix_label = TrackingLabel(self) self.pix_label = DicomWidget(self) # self.color_table = [QtWidgets.qRgb(i, i, i) for i in range(256)] scroll_area = QtWidgets.QScrollArea() scroll_area.setWidget(self.pix_label) # self.setCentralWidget(self.pix_label) self.setCentralWidget(scroll_area) self.series_dock = QtWidgets.QDockWidget("Series", self) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.series_dock) self.file_dock = QtWidgets.QDockWidget("Images", self) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.file_dock) self.file_list = QtWidgets.QListWidget() self.file_list.itemSelectionChanged.connect(self.on_file_item_change) self.file_dock.setWidget(self.file_list) self.series_list = QtWidgets.QListWidget() # self.studies_list.itemSelectionChanged.connect(self.on_study_item_change) self.series_dock.setWidget(self.series_list) self.hu_label = QtWidgets.QLabel("No image") self.c_label = QtWidgets.QLabel("") self.cw_label = QtWidgets.QLabel("") self.x_label = QtWidgets.QLabel("") self.y_label = QtWidgets.QLabel("") self.z_label = QtWidgets.QLabel("") self.use_fractional_coordinates = True self.ij_label = QtWidgets.QLabel("") self._zoom_level = 1 self.mouse_x = -1 self.mouse_y = -1 self.statusBar().addPermanentWidget(self.cw_label) self.statusBar().addPermanentWidget(self.ij_label) self.statusBar().addPermanentWidget(self.x_label) self.statusBar().addPermanentWidget(self.y_label) self.statusBar().addPermanentWidget(self.z_label) self.statusBar().addPermanentWidget(self.hu_label) self.data = np.ndarray((512, 512), np.int8) self.update_cw() if os.path.isfile(path): self.load_files([path]) elif os.path.isdir(path): self.load_files(dicom_files_in_dir(path)) self.build_menu()
def setupUi(self, MainWindow): ## -- 主窗体设置 -- MainWindow.setObjectName("MainWindow") MainWindow.setMinimumSize(QtCore.QSize(1366, 768)) MainWindow.setWindowTitle(__APPNAME__) CentralWidget = QtWidgets.QWidget(MainWindow) CentralWidget.setObjectName("CentralWidget") MainWindow.setCentralWidget(CentralWidget) ## ----- ## -- 工具栏 -- toolBar = QtWidgets.QToolBar(self) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(toolBar.sizePolicy().hasHeightForWidth()) toolBar.setSizePolicy(sizePolicy) toolBar.setMinimumSize(QtCore.QSize(0, 33)) toolBar.setMovable(True) toolBar.setAllowedAreas(QtCore.Qt.BottomToolBarArea | QtCore.Qt.TopToolBarArea) toolBar.setObjectName("toolBar") self.toolBar = toolBar MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) ## ----- ## -- 状态栏 -- self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") self.statusbar.setStyleSheet("QStatusBar::item {border: none;}") MainWindow.setStatusBar(self.statusbar) self.statusbar.addPermanentWidget( self.show_logo(osp.join(pjpath, "resource/Paddle.png"))) ## ----- ## -- 图形区域 -- ImageRegion = QtWidgets.QHBoxLayout(CentralWidget) ImageRegion.setObjectName("ImageRegion") # 滑动区域 self.scrollArea = QtWidgets.QScrollArea(CentralWidget) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") ImageRegion.addWidget(self.scrollArea) # 图形显示 self.scene = QtWidgets.QGraphicsScene() self.scene.addPixmap(QtGui.QPixmap()) self.canvas = Canvas(self.scene, self) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.canvas.setSizePolicy(sizePolicy) self.canvas.setAlignment(QtCore.Qt.AlignCenter) self.canvas.setAutoFillBackground(False) self.canvas.setStyleSheet("background-color: White") self.canvas.setObjectName("canvas") self.scrollArea.setWidget(self.canvas) ## ----- ## -- 工作区 -- self.dockWorker = QtWidgets.QDockWidget(MainWindow) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.dockWorker.sizePolicy().hasHeightForWidth()) self.dockWorker.setSizePolicy(sizePolicy) self.dockWorker.setMinimumSize(QtCore.QSize(71, 42)) self.dockWorker.setWindowTitle(" ") # 避免拖出后显示“python” self.dockWorker.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable | QtWidgets.QDockWidget.DockWidgetMovable) self.dockWorker.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) self.dockWorker.setObjectName("dockWorker") p_create_button = partial(self.create_button, CentralWidget) # 设置区设置 DockRegion = QtWidgets.QWidget() DockRegion.setObjectName("DockRegion") horizontalLayout = QtWidgets.QHBoxLayout(DockRegion) horizontalLayout.setObjectName("horizontalLayout") SetRegion = QtWidgets.QVBoxLayout() SetRegion.setObjectName("SetRegion") # 模型加载 ModelRegion = QtWidgets.QVBoxLayout() ModelRegion.setObjectName("ModelRegion") labShowSet = self.create_text(CentralWidget, "labShowSet", "模型选择") ModelRegion.addWidget(labShowSet) combo = QtWidgets.QComboBox(self) combo.addItems([m.__name__ for m in MODELS]) self.comboModelSelect = combo ModelRegion.addWidget(self.comboModelSelect) # 网络参数 self.btnParamsSelect = p_create_button( "btnParamsLoad", "加载网络参数", osp.join(pjpath, "resource/Model.png"), "Ctrl+D") ModelRegion.addWidget(self.btnParamsSelect) # 模型选择 SetRegion.addLayout(ModelRegion) SetRegion.setStretch(0, 1) # 数据列表 # TODO: 数据列表加一个搜索功能 listRegion = QtWidgets.QVBoxLayout() listRegion.setObjectName("listRegion") labFiles = self.create_text(CentralWidget, "labFiles", "数据列表") listRegion.addWidget(labFiles) self.listFiles = QtWidgets.QListWidget(CentralWidget) self.listFiles.setObjectName("listFiles") listRegion.addWidget(self.listFiles) # 标签列表 labelListLab = self.create_text(CentralWidget, "labelListLab", "标签列表") listRegion.addWidget(labelListLab) # TODO: 改成 list widget self.labelListTable = QtWidgets.QTableWidget(CentralWidget) self.labelListTable.horizontalHeader().hide() # 铺满 self.labelListTable.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.Stretch) self.labelListTable.verticalHeader().hide() self.labelListTable.setColumnWidth(0, 10) # self.labelListTable.setMinimumWidth() self.labelListTable.setObjectName("labelListTable") listRegion.addWidget(self.labelListTable) self.btnAddClass = p_create_button( "btnAddClass", "添加标签", osp.join(pjpath, "resource/Label.png")) listRegion.addWidget(self.btnAddClass) SetRegion.addLayout(listRegion) SetRegion.setStretch(1, 20) # 滑块设置 # 分割阈值 p_create_slider = partial(self.create_slider, CentralWidget) ShowSetRegion = QtWidgets.QVBoxLayout() ShowSetRegion.setObjectName("ShowSetRegion") self.sldThresh, SegShowRegion = p_create_slider( "sldThresh", "labThresh", "分割阈值:") ShowSetRegion.addLayout(SegShowRegion) ShowSetRegion.addWidget(self.sldThresh) # 透明度 self.sldOpacity, MaskShowRegion = p_create_slider( "sldOpacity", "labOpacity", "标签透明度:") ShowSetRegion.addLayout(MaskShowRegion) ShowSetRegion.addWidget(self.sldOpacity) # 点大小 self.sldClickRadius, PointShowRegion = p_create_slider( "sldClickRadius", "labClickRadius", "点击可视化半径:", 3, 10, 1) ShowSetRegion.addLayout(PointShowRegion) ShowSetRegion.addWidget(self.sldClickRadius) SetRegion.addLayout(ShowSetRegion) SetRegion.setStretch(2, 1) # 保存 self.btnSave = p_create_button("btnSave", "保存", osp.join(pjpath, "resource/Save.png"), "Ctrl+S") SetRegion.addWidget(self.btnSave) SetRegion.setStretch(3, 1) # dock设置完成 horizontalLayout.addLayout(SetRegion) self.dockWorker.setWidget(DockRegion) MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWorker) ## ----- QtCore.QMetaObject.connectSlotsByName(MainWindow)
def __init__(self, config=None, filename=None, output=None): # see labelme/config/default_config.yaml for valid configuration if config is None: config = get_config() self._config = config super(MainWindow, self).__init__() self.setWindowTitle(__appname__) # Whether we need to save or not. self.dirty = False self._noSelectionSlot = False # Main widgets and related state. self.labelDialog = LabelDialog( parent=self, labels=self._config['labels'], sort_labels=self._config['sort_labels'], show_text_field=self._config['show_label_text_field'], ) self.labelList = LabelQListWidget() self.lastOpenDir = None self.labelList.itemActivated.connect(self.labelSelectionChanged) self.labelList.itemSelectionChanged.connect(self.labelSelectionChanged) self.labelList.itemDoubleClicked.connect(self.editLabel) # Connect to itemChanged to detect checkbox changes. self.labelList.itemChanged.connect(self.labelItemChanged) self.labelList.setDragDropMode( QtWidgets.QAbstractItemView.InternalMove) self.labelList.setParent(self) listLayout = QtWidgets.QVBoxLayout() listLayout.setContentsMargins(0, 0, 0, 0) self.editButton = QtWidgets.QToolButton() self.editButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) listLayout.addWidget(self.editButton) # 0, Qt.AlignCenter) listLayout.addWidget(self.labelList) self.labelListContainer = QtWidgets.QWidget() self.labelListContainer.setLayout(listLayout) self.uniqLabelList = EscapableQListWidget() self.uniqLabelList.setToolTip( "Select label to start annotating for it. " "Press 'Esc' to deselect.") if self._config['labels']: self.uniqLabelList.addItems(self._config['labels']) self.uniqLabelList.sortItems() self.labelsdock = QtWidgets.QDockWidget(u'Label List', self) self.labelsdock.setObjectName(u'Label List') self.labelsdock.setWidget(self.uniqLabelList) self.dock = QtWidgets.QDockWidget('Polygon Labels', self) self.dock.setObjectName('Labels') self.dock.setWidget(self.labelListContainer) self.fileListWidget = QtWidgets.QListWidget() self.fileListWidget.itemSelectionChanged.connect( self.fileSelectionChanged) filelistLayout = QtWidgets.QVBoxLayout() filelistLayout.setContentsMargins(0, 0, 0, 0) filelistLayout.addWidget(self.fileListWidget) fileListContainer = QtWidgets.QWidget() fileListContainer.setLayout(filelistLayout) self.filedock = QtWidgets.QDockWidget(u'File List', self) self.filedock.setObjectName(u'Files') self.filedock.setWidget(fileListContainer) self.zoomWidget = ZoomWidget() self.colorDialog = ColorDialog(parent=self) self.canvas = self.labelList.canvas = Canvas() self.canvas.zoomRequest.connect(self.zoomRequest) scrollArea = QtWidgets.QScrollArea() scrollArea.setWidget(self.canvas) scrollArea.setWidgetResizable(True) self.scrollBars = { Qt.Vertical: scrollArea.verticalScrollBar(), Qt.Horizontal: scrollArea.horizontalScrollBar(), } self.canvas.scrollRequest.connect(self.scrollRequest) self.canvas.newShape.connect(self.newShape) self.canvas.shapeMoved.connect(self.setDirty) self.canvas.selectionChanged.connect(self.shapeSelectionChanged) self.canvas.drawingPolygon.connect(self.toggleDrawingSensitive) self.setCentralWidget(scrollArea) self.addDockWidget(Qt.RightDockWidgetArea, self.labelsdock) self.addDockWidget(Qt.RightDockWidgetArea, self.dock) self.addDockWidget(Qt.RightDockWidgetArea, self.filedock) self.filedock.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable) self.dockFeatures = (QtWidgets.QDockWidget.DockWidgetClosable | QtWidgets.QDockWidget.DockWidgetFloatable) self.dock.setFeatures(self.dock.features() ^ self.dockFeatures) # Actions action = functools.partial(newAction, self) shortcuts = self._config['shortcuts'] quit = action('&Quit', self.close, shortcuts['quit'], 'quit', 'Quit application') open_ = action('&Open', self.openFile, shortcuts['open'], 'open', 'Open image or label file') opendir = action('&Open Dir', self.openDirDialog, shortcuts['open_dir'], 'open', u'Open Dir') openNextImg = action('&Next Image', self.openNextImg, shortcuts['open_next'], 'next', u'Open Next') openPrevImg = action('&Prev Image', self.openPrevImg, shortcuts['open_prev'], 'prev', u'Open Prev') save = action('&Save', self.saveFile, shortcuts['save'], 'save', 'Save labels to file', enabled=False) saveAs = action('&Save As', self.saveFileAs, shortcuts['save_as'], 'save-as', 'Save labels to a different file', enabled=False) close = action('&Close', self.closeFile, shortcuts['close'], 'close', 'Close current file') color1 = action('Polygon &Line Color', self.chooseColor1, shortcuts['edit_line_color'], 'color_line', 'Choose polygon line color') color2 = action('Polygon &Fill Color', self.chooseColor2, shortcuts['edit_fill_color'], 'color', 'Choose polygon fill color') createMode = action('Create\nPolygo&ns', self.setCreateMode, shortcuts['create_polygon'], 'objects', 'Start drawing polygons', enabled=True) editMode = action('&Edit\nPolygons', self.setEditMode, shortcuts['edit_polygon'], 'edit', 'Move and edit polygons', enabled=True) delete = action('Delete\nPolygon', self.deleteSelectedShape, shortcuts['delete_polygon'], 'cancel', 'Delete', enabled=False) copy = action('&Duplicate\nPolygon', self.copySelectedShape, shortcuts['duplicate_polygon'], 'copy', 'Create a duplicate of the selected polygon', enabled=False) undoLastPoint = action('Undo last point', self.canvas.undoLastPoint, shortcuts['undo_last_point'], 'undo', 'Undo last drawn point', enabled=False) undo = action('Undo', self.undoShapeEdit, shortcuts['undo'], 'undo', 'Undo last add and edit of shape', enabled=False) hideAll = action('&Hide\nPolygons', functools.partial(self.togglePolygons, False), icon='eye', tip='Hide all polygons', enabled=False) showAll = action('&Show\nPolygons', functools.partial(self.togglePolygons, True), icon='eye', tip='Show all polygons', enabled=False) help = action('&Tutorial', self.tutorial, icon='help', tip='Show tutorial page') zoom = QtWidgets.QWidgetAction(self) zoom.setDefaultWidget(self.zoomWidget) self.zoomWidget.setWhatsThis( "Zoom in or out of the image. Also accessible with" " %s and %s from the canvas." % (fmtShortcut('%s,%s' % (shortcuts['zoom_in'], shortcuts['zoom_out'])), fmtShortcut("Ctrl+Wheel"))) self.zoomWidget.setEnabled(False) zoomIn = action('Zoom &In', functools.partial(self.addZoom, 10), shortcuts['zoom_in'], 'zoom-in', 'Increase zoom level', enabled=False) zoomOut = action('&Zoom Out', functools.partial(self.addZoom, -10), shortcuts['zoom_out'], 'zoom-out', 'Decrease zoom level', enabled=False) zoomOrg = action('&Original size', functools.partial(self.setZoom, 100), shortcuts['zoom_to_original'], 'zoom', 'Zoom to original size', enabled=False) fitWindow = action('&Fit Window', self.setFitWindow, shortcuts['fit_window'], 'fit-window', 'Zoom follows window size', checkable=True, enabled=False) fitWidth = action('Fit &Width', self.setFitWidth, shortcuts['fit_width'], 'fit-width', 'Zoom follows window width', checkable=True, enabled=False) # Group zoom controls into a list for easier toggling. zoomActions = (self.zoomWidget, zoomIn, zoomOut, zoomOrg, fitWindow, fitWidth) self.zoomMode = self.MANUAL_ZOOM self.scalers = { self.FIT_WINDOW: self.scaleFitWindow, self.FIT_WIDTH: self.scaleFitWidth, # Set to one to scale to 100% when loading files. self.MANUAL_ZOOM: lambda: 1, } edit = action('&Edit Label', self.editLabel, shortcuts['edit_label'], 'edit', 'Modify the label of the selected polygon', enabled=False) self.editButton.setDefaultAction(edit) shapeLineColor = action( 'Shape &Line Color', self.chshapeLineColor, icon='color-line', tip='Change the line color for this specific shape', enabled=False) shapeFillColor = action( 'Shape &Fill Color', self.chshapeFillColor, icon='color', tip='Change the fill color for this specific shape', enabled=False) labels = self.dock.toggleViewAction() labels.setText('Show/Hide Label Panel') # Lavel list context menu. labelMenu = QtWidgets.QMenu() addActions(labelMenu, (edit, delete)) self.labelList.setContextMenuPolicy(Qt.CustomContextMenu) self.labelList.customContextMenuRequested.connect( self.popLabelListMenu) # Store actions for further handling. self.actions = struct( save=save, saveAs=saveAs, open=open_, close=close, lineColor=color1, fillColor=color2, delete=delete, edit=edit, copy=copy, undoLastPoint=undoLastPoint, undo=undo, createMode=createMode, editMode=editMode, shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor, zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg, fitWindow=fitWindow, fitWidth=fitWidth, zoomActions=zoomActions, fileMenuActions=(open_, opendir, save, saveAs, close, quit), tool=(), editMenu=(edit, copy, delete, None, undo, undoLastPoint, None, color1, color2), menu=( createMode, editMode, edit, copy, delete, shapeLineColor, shapeFillColor, undo, undoLastPoint, ), onLoadActive=(close, createMode, editMode), onShapesPresent=(saveAs, hideAll, showAll), ) self.menus = struct( file=self.menu('&File'), edit=self.menu('&Edit'), view=self.menu('&View'), help=self.menu('&Help'), recentFiles=QtWidgets.QMenu('Open &Recent'), labelList=labelMenu, ) addActions(self.menus.file, (open_, opendir, self.menus.recentFiles, save, saveAs, close, None, quit)) addActions(self.menus.help, (help, )) addActions(self.menus.view, (labels, None, hideAll, showAll, None, zoomIn, zoomOut, zoomOrg, None, fitWindow, fitWidth)) self.menus.file.aboutToShow.connect(self.updateFileMenu) # Custom context menu for the canvas widget: addActions(self.canvas.menus[0], self.actions.menu) addActions(self.canvas.menus[1], (action('&Copy here', self.copyShape), action('&Move here', self.moveShape))) self.tools = self.toolbar('Tools') self.actions.tool = (open_, opendir, openNextImg, openPrevImg, save, None, createMode, copy, delete, editMode, undo, None, zoomIn, zoom, zoomOut, fitWindow, fitWidth) self.statusBar().showMessage('%s started.' % __appname__) self.statusBar().show() # Application state. self.image = QtGui.QImage() self.imagePath = None if self._config['auto_save'] and output is not None: warnings.warn('If `auto_save` argument is True, `output` argument ' 'is ignored and output filename is automatically ' 'set as IMAGE_BASENAME.json.') self.labeling_once = output is not None self.output = output self.recentFiles = [] self.maxRecent = 7 self.lineColor = None self.fillColor = None self.otherData = None self.zoom_level = 100 self.fit_window = False if filename is not None and os.path.isdir(filename): self.importDirImages(filename, load=False) else: self.filename = filename # XXX: Could be completely declarative. # Restore application settings. self.settings = QtCore.QSettings('labelme', 'labelme') # FIXME: QSettings.value can return None on PyQt4 self.recentFiles = self.settings.value('recentFiles', []) or [] size = self.settings.value('window/size', QtCore.QSize(600, 500)) position = self.settings.value('window/position', QtCore.QPoint(0, 0)) self.resize(size) self.move(position) # or simply: # self.restoreGeometry(settings['window/geometry'] self.restoreState( self.settings.value('window/state', QtCore.QByteArray())) self.lineColor = QtGui.QColor( self.settings.value('line/color', Shape.line_color)) self.fillColor = QtGui.QColor( self.settings.value('fill/color', Shape.fill_color)) Shape.line_color = self.lineColor Shape.fill_color = self.fillColor # Populate the File menu dynamically. self.updateFileMenu() # Since loading the file may take some time, # make sure it runs in the background. if self.filename is not None: self.queueEvent(functools.partial(self.loadFile, self.filename)) # Callbacks: self.zoomWidget.valueChanged.connect(self.paintCanvas) self.populateModeActions()
def __init__(self, parent=None): super(MainWidget, self).__init__(parent) self.setWindowTitle(self.tr("GraphViz")) self.setWindowIcon(QtGui.QIcon("GraphViz.ico")) self.toolbar = self.addToolBar("tool") self.toolwidget = ToolWidget() self.toolwidget.graphsignal.connect(self.startWork) self.toolwidget.graphsignal2.connect(self.startWork2) self.toolbar.addWidget(self.toolwidget) mwidget = QtWidgets.QWidget() self.vbl = QtWidgets.QVBoxLayout(mwidget) self.vbl.setSpacing(0) self.vbl.setContentsMargins(0, 0, 0, 0) self.stackwidget = QtWidgets.QStackedWidget() self.controlWidget = ControlWidget() self.controlWidget.resetBtn.clicked.connect(self.resetFilter) self.controlWidget.applyBtn.clicked.connect(self.applyFilter) self.process = GraphProcessBar() self.process.setVisible(False) self.vbl.addWidget(self.stackwidget) self.vbl.addWidget(self.controlWidget) self.vbl.addWidget(self.process) self.centralWidget = GraphHigh() self.centralWidget.draw_init() self.centralWidget.neighbors_signal.connect(self.setNeighbors) self.stackwidget.addWidget(QtWidgets.QWidget()) self.stackwidget.addWidget(self.centralWidget) self.setCentralWidget(mwidget) self.stackwidget.setCurrentIndex(0) self.dockGraph = QtWidgets.QDockWidget(self.tr("Node attributes"), self) self.dockGraph.setFixedWidth(350) self.dockGraph.setFeatures(QtWidgets.QDockWidget.DockWidgetFloatable | QtWidgets.QDockWidget.DockWidgetMovable) self.dockGraph.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) widget = QtWidgets.QWidget() vbl = QtWidgets.QVBoxLayout(widget) vbl.setSpacing(0) vbl.setContentsMargins(0, 0, 0, 0) self.textInfo = QtWidgets.QTextEdit() self.textInfo.setReadOnly(True) self.graphNodesWidget = InfoTableWidget() self.graphNodesWidget.dbclickedSig.connect( self.centralWidget.updateMarkerVisible) vbl.addWidget(self.textInfo) vbl.addWidget(self.graphNodesWidget) self.dockGraph.setWidget(widget) self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dockGraph) self.dockGraph.hide() self.controlWidget.hide() self.work = GraphWork() self.nodesAttrs = [ "label", "node_type", "InDegree", "OutDegree", "Degree", "Betweeness", "Closeness", "PageRank", "Louvain", "Label propagation", "Union find", ]
def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("pyMonteCarlo") self.setWindowIcon(load_pixmap("logo_32x32.png")) # Variables self._should_save = False self._settings = Settings.read() max_workers = multiprocessing.cpu_count() - 1 self._runner = LocalSimulationRunner(max_workers=max_workers) # Actions self.action_new_project = QtWidgets.QAction("New project") self.action_new_project.setIcon(QtGui.QIcon.fromTheme("document-new")) self.action_new_project.setShortcut(QtGui.QKeySequence.New) self.action_new_project.triggered.connect(self.newProject) self.action_open_project = QtWidgets.QAction("Open project") self.action_open_project.setIcon( QtGui.QIcon.fromTheme("document-open")) self.action_open_project.setShortcut(QtGui.QKeySequence.Open) self.action_open_project.triggered.connect( functools.partial(self.openProject, None)) self.action_save_project = QtWidgets.QAction("Save project") self.action_save_project.setIcon( QtGui.QIcon.fromTheme("document-save")) self.action_save_project.setShortcut(QtGui.QKeySequence.Save) self.action_save_project.triggered.connect( functools.partial(self.saveProject, None)) self.action_settings = QtWidgets.QAction("Settings") self.action_settings.setIcon( QtGui.QIcon.fromTheme("preferences-system")) self.action_settings.setShortcut(QtGui.QKeySequence.Preferences) self.action_settings.triggered.connect(self._on_settings) self.action_quit = QtWidgets.QAction("Quit") self.action_quit.setShortcut(QtGui.QKeySequence.Quit) self.action_quit.triggered.connect(self.close) self.action_create_simulations = QtWidgets.QAction( "Create new simulations") self.action_create_simulations.setIcon(load_icon("newsimulation.svg")) self.action_create_simulations.triggered.connect( self._on_create_new_simulations) self.action_stop_simulations = QtWidgets.QAction( "Stop all simulations") self.action_stop_simulations.setIcon( QtGui.QIcon.fromTheme("media-playback-stop")) self.action_stop_simulations.triggered.connect(self._on_stop) self.action_stop_simulations.setEnabled(False) # Timers self.timer_runner = QtCore.QTimer() self.timer_runner.setInterval(1000) self.timer_runner.setSingleShot(False) # Menus menu = self.menuBar() menu_file = menu.addMenu("File") menu_file.addAction(self.action_new_project) menu_file.addAction(self.action_open_project) menu_file.addAction(self.action_save_project) menu_file.addSeparator() menu_file.addAction(self.action_settings) menu_file.addSeparator() menu_file.addAction(self.action_quit) menu_simulation = menu.addMenu("Simulation") menu_simulation.addAction(self.action_create_simulations) menu_simulation.addAction(self.action_stop_simulations) # Tool bar toolbar_file = self.addToolBar("File") toolbar_file.addAction(self.action_new_project) toolbar_file.addAction(self.action_open_project) toolbar_file.addAction(self.action_save_project) toolbar_simulation = self.addToolBar("Simulation") toolbar_simulation.addAction(self.action_create_simulations) toolbar_simulation.addAction(self.action_stop_simulations) # Status bar self.statusbar_submitted = QtWidgets.QLabel() self.statusbar_submitted.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken) self.statusbar_done = QtWidgets.QLabel() self.statusbar_done.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken) self.statusbar_progressbar = QtWidgets.QProgressBar() self.statusbar_progressbar.setRange(0, 100) statusbar = self.statusBar() statusbar.addPermanentWidget(self.statusbar_submitted) statusbar.addPermanentWidget(self.statusbar_done) statusbar.addPermanentWidget(self.statusbar_progressbar) # Widgets self.tree = FieldTree() self.dock_project = QtWidgets.QDockWidget("Project") self.dock_project.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) self.dock_project.setFeatures( QtWidgets.QDockWidget.NoDockWidgetFeatures | QtWidgets.QDockWidget.DockWidgetMovable) self.dock_project.setWidget(self.tree) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dock_project) self.table_runner = TokenTableWidget(self._runner.token) self.dock_runner = QtWidgets.QDockWidget("Run") self.dock_runner.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) self.dock_runner.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures | QtWidgets.QDockWidget.DockWidgetMovable) self.dock_runner.setWidget(self.table_runner) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dock_runner) self.tabifyDockWidget(self.dock_project, self.dock_runner) self.dock_project.raise_() self.mdiarea = FieldMdiArea() self.setCentralWidget(self.mdiarea) # Dialogs self.wizard_simulation = NewSimulationWizard(self._settings) self.dialog_settings = SettingsDialog() # Signals self.tree.doubleClicked.connect(self._on_tree_double_clicked) self.mdiarea.windowOpened.connect(self._on_mdiarea_window_opened) self.mdiarea.windowClosed.connect(self._on_mdiarea_window_closed) self.timer_runner.timeout.connect(self._on_timer_runner_timeout) self.newSimulations.connect(self._on_new_simulations) # Start logger.debug("Before new project action") self.action_new_project.trigger() # Required to setup project self.timer_runner.start()
self.toggle_animation.animationCount() - 1 ) content_animation.setDuration(200) content_animation.setStartValue(0) content_animation.setEndValue(content_height) if __name__ == "__main__": import sys import random app = QtWidgets.QApplication(sys.argv) w = QtWidgets.QMainWindow() w.setCentralWidget(QtWidgets.QWidget()) dock = QtWidgets.QDockWidget("Collapsible Demo") w.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dock) scroll = QtWidgets.QScrollArea() dock.setWidget(scroll) content = QtWidgets.QWidget() scroll.setWidget(content) scroll.setWidgetResizable(True) vlay = QtWidgets.QVBoxLayout(content) for i in range(10): box = CollapsibleBox("Collapsible Box Header-{}".format(i)) vlay.addWidget(box) lay = QtWidgets.QVBoxLayout() for j in range(8): label = QtWidgets.QLineEdit("{}".format(j)) color = QtGui.QColor(*[random.randint(0, 255) for _ in range(3)]) label.setStyleSheet(
def main(): """Execute QDarkStyle example.""" parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( '--palette', default='dark', type=str, choices=['dark', 'light', 'none'], help= "Palette to display. Using 'none' there is no style sheet applied, OS like." ) parser.add_argument( '--qt_from', default='qtpy', type=str, choices=[ 'pyqt5', 'pyqt', 'pyside2', 'pyside', 'qtpy', 'pyqtgraph', 'qt.py' ], help= "Choose which binding and/or abstraction is to be used to run the example. Default is 'qtpy'" ) parser.add_argument('--test', action='store_true', help="Auto close window after 2s.") parser.add_argument('--screenshots', action='store_true', help="Generate screenshots on images folder.") parser.add_argument( '--offscreen', action='store_true', help="Do not try to show the screen (running on server).") parser.add_argument('--reset', action='store_true', help="Reset GUI settings (position, size) then opens.") # Parsing arguments from command line args = parser.parse_args() # To avoid problems when testing without screen if args.test or args.offscreen: os.environ['QT_QPA_PLATFORM'] = 'offscreen' # Set QT_API variable before importing QtPy if args.qt_from in ['pyqt', 'pyqt5', 'pyside', 'pyside2']: os.environ['QT_API'] = args.qt_from elif args.qt_from == 'pyqtgraph': os.environ['QT_API'] = os.environ['PYQTGRAPH_QT_LIB'] elif args.qt_from in ['qt.py', 'qt']: try: import Qt except ImportError: print('Could not import Qt (Qt.Py)') else: os.environ['QT_API'] = Qt.__binding__ # QtPy imports from qtpy import API_NAME, QT_VERSION, PYQT_VERSION, PYSIDE_VERSION, uic from qtpy import __version__ as QTPY_VERSION from qtpy import QtCore, QtGui, QtWidgets # Set API_VERSION variable API_VERSION = '' if PYQT_VERSION: API_VERSION = PYQT_VERSION elif PYSIDE_VERSION: API_VERSION = PYSIDE_VERSION else: API_VERSION = 'Not found' # create the application app = QtWidgets.QApplication(sys.argv) app.setOrganizationName('QDarkStyle') app.setApplicationName('QDarkStyle Example') style = '' if args.palette == 'dark': style = qdarkstyle.load_stylesheet(palette=DarkPalette) elif args.palette == 'light': style = qdarkstyle.load_stylesheet(palette=LightPalette) app.setStyleSheet(style) # create main window window = QtWidgets.QMainWindow() window.setObjectName('mainwindow') uic.loadUi(os.path.join(here, 'ui/mw_menus.ui'), window) title = ( "QDarkStyle Example - (" + f"QDarkStyle=v{qdarkstyle.__version__}, " + f"QtPy=v{QTPY_VERSION}, " + f"{API_NAME}=v{API_VERSION}, " + f"Qt=v{QT_VERSION}, " + f"Python=v{platform.python_version()}, " # Operating system info are maybe too much, # but different OS add info in different places + f"System={platform.system()}, " + f"Release={platform.release()}, " + f"Version={platform.version()}, " + f"Platform={platform.platform()}" + ")") _logger.info(title) window.setWindowTitle(title) # Create docks for buttons dw_buttons = QtWidgets.QDockWidget() dw_buttons.setObjectName('buttons') uic.loadUi(os.path.join(here, 'ui/dw_buttons.ui'), dw_buttons) window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_buttons) # Set state indeterminate (value=1) dw_buttons.checkBoxTristate.stateChanged.connect( dw_buttons.checkBoxTristateDis.setCheckState) dw_buttons.checkBoxTristate.setCheckState(1) # Add actions on popup toolbuttons menu = QtWidgets.QMenu() for action in ['Action A', 'Action B', 'Action C']: menu.addAction(action) # Add menu in special tool buttons dw_buttons.toolButtonDelayedPopup.setMenu(menu) dw_buttons.toolButtonInstantPopup.setMenu(menu) dw_buttons.toolButtonMenuButtonPopup.setMenu(menu) # Add menu in toolbar #251 action_menu = QtWidgets.QAction(u'Menu action', window.toolBarMenus) action_menu.setMenu(menu) window.toolBarMenus.addAction(action_menu) # Add color to tab title text #212 window.tabWidget.tabBar().setTabTextColor(3, QtGui.QColor('red')) # Connect dialogs to buttons window.toolButtonColorDialog.clicked.connect( lambda: QtWidgets.QColorDialog().exec()) window.toolButtonFileDialog.clicked.connect( lambda: QtWidgets.QFileDialog().exec()) window.toolButtonFileDialogStatic.clicked.connect( lambda: QtWidgets.QFileDialog.getOpenFileNames()) window.toolButtonFontDialog.clicked.connect( lambda: QtWidgets.QFontDialog().exec()) window.toolButtonInputDialog.clicked.connect( lambda: QtWidgets.QInputDialog().exec()) window.toolButtonMessageBox.clicked.connect( lambda: QtWidgets.QMessageBox().exec()) window.toolButtonMessageBoxStatic.clicked.connect( lambda: QtWidgets.QMessageBox.critical(window, "Critical title", "Critical message")) window.toolButtonProgressDialog.clicked.connect( lambda: QtWidgets.QProgressDialog().exec()) # Create docks for buttons dw_displays = QtWidgets.QDockWidget() dw_displays.setObjectName('displays') uic.loadUi(os.path.join(here, 'ui/dw_displays.ui'), dw_displays) window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_displays) # Create docks for inputs - no fields dw_inputs_no_fields = QtWidgets.QDockWidget() dw_inputs_no_fields.setObjectName('inputs_no_fields') uic.loadUi(os.path.join(here, 'ui/dw_inputs_no_fields.ui'), dw_inputs_no_fields) window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_inputs_no_fields) # Create docks for inputs - fields dw_inputs_fields = QtWidgets.QDockWidget() dw_inputs_fields.setObjectName('inputs_fields') uic.loadUi(os.path.join(here, 'ui/dw_inputs_fields.ui'), dw_inputs_fields) window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw_inputs_fields) # Create docks for widgets dw_widgets = QtWidgets.QDockWidget() dw_widgets.setObjectName('widgets') uic.loadUi(os.path.join(here, 'ui/dw_widgets.ui'), dw_widgets) window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_widgets) # Create docks for views dw_views = QtWidgets.QDockWidget() dw_views.setObjectName('views') uic.loadUi(os.path.join(here, 'ui/dw_views.ui'), dw_views) window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_views) # Create docks for containers - no tabs dw_containers_no_tabs = QtWidgets.QDockWidget() dw_containers_no_tabs.setObjectName('containers_no_tabs') uic.loadUi(os.path.join(here, 'ui/dw_containers_no_tabs.ui'), dw_containers_no_tabs) window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_containers_no_tabs) # Create docks for containters - tabs dw_containers_tabs = QtWidgets.QDockWidget() dw_containers_tabs.setObjectName('containers_tabs') uic.loadUi(os.path.join(here, 'ui/dw_containers_tabs.ui'), dw_containers_tabs) window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw_containers_tabs) # Tabify right docks window.tabifyDockWidget(dw_buttons, dw_displays) window.tabifyDockWidget(dw_displays, dw_inputs_fields) window.tabifyDockWidget(dw_inputs_fields, dw_inputs_no_fields) # Tabify left docks window.tabifyDockWidget(dw_containers_no_tabs, dw_containers_tabs) window.tabifyDockWidget(dw_containers_tabs, dw_widgets) window.tabifyDockWidget(dw_widgets, dw_views) # Issues #9120, #9121 on Spyder qstatusbar = QtWidgets.QStatusBar() qstatusbar.addWidget( QtWidgets.QLabel( 'Issue Spyder #9120, #9121 - background not matching.')) qstatusbar.addWidget(QtWidgets.QPushButton('OK')) # Add info also in status bar for screenshots get it qstatusbar.addWidget(QtWidgets.QLabel('INFO: ' + title)) window.setStatusBar(qstatusbar) # Todo: add report info and other info in HELP graphical # Auto quit after 2s when in test mode if args.test: QtCore.QTimer.singleShot(2000, app.exit) # Save screenshots for different displays and quit if args.screenshots: window.showFullScreen() create_screenshots(app, window, args) # Do not read settings when taking screenshots - like reset else: _read_settings(window, args.reset, QtCore.QSettings) window.showMaximized() app.exec_() _write_settings(window, QtCore.QSettings)
def init_UI(self): self.classes = self.get_classes() self.crop_image_viewer = QtWidgets.QLabel() self.crop_image_viewer.setAlignment(Qt.AlignCenter) self.crop_image_viewer.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) self.crop_image_viewer.setAcceptDrops(True) self.crop_image_viewer.rotation = 0 self.crop_image_viewer.rotate = False self.crop_image_scrollArea = QtWidgets.QScrollArea() self.crop_image_scrollArea.setWidget(self.crop_image_viewer) self.crop_image_scrollArea.setAlignment(Qt.AlignCenter) self.crop_image_list = QtWidgets.QListWidget() self.crop_image_list.setMaximumHeight(60) self.crop_image_list.itemClicked.connect(self.select_crop_image) self.catListLabel = QtWidgets.QLabel() self.catListLabel.setText("Labels") self.catListWidget = QtWidgets.QComboBox() for cls in self.classes: self.catListWidget.addItem(cls) self.catListLayout = QtWidgets.QHBoxLayout() self.catListLayout.addWidget(self.catListLabel, 20) self.catListLayout.addWidget(self.catListWidget, 80) self.catWidget = QtWidgets.QWidget() self.catWidget.setLayout(self.catListLayout) self.catLineEditLabel = QtWidgets.QLabel() self.catLineEditLabel.setText("Input label") self.catLineEditWidget = QtWidgets.QLineEdit() self.catLineEditLayout = QtWidgets.QHBoxLayout() self.catLineEditLayout.addWidget(self.catLineEditLabel, 20) self.catLineEditLayout.addWidget(self.catLineEditWidget, 80) self.catEditWidget = QtWidgets.QWidget() self.catEditWidget.setLayout(self.catLineEditLayout) self.catAddButton = QtWidgets.QPushButton() self.catAddButton.setText("add") self.catAddButton.clicked.connect(self.add_cless) self.catDeleteButton = QtWidgets.QPushButton() self.catDeleteButton.setText("delete") self.catDeleteButton.clicked.connect(self.delete_class) self.catSelectButton = QtWidgets.QPushButton() self.catSelectButton.setText("save") self.catSelectButton.clicked.connect(self.category_save) # layout self.buttonLayout = QtWidgets.QHBoxLayout() self.buttonLayout.addWidget(self.catAddButton) self.buttonLayout.addWidget(self.catDeleteButton) self.buttonLayout.addWidget(self.catSelectButton) self.buttonWidget = QtWidgets.QWidget() self.buttonWidget.setLayout(self.buttonLayout) self.catLayout = QtWidgets.QVBoxLayout() self.catLayout.setAlignment(Qt.AlignRight) self.catLayout.addWidget(self.crop_image_scrollArea) self.catLayout.addWidget(self.crop_image_list) self.catLayout.addWidget(self.catWidget) self.catLayout.addWidget(self.catEditWidget) self.catLayout.addWidget(self.buttonWidget) self.baseWidget = QtWidgets.QWidget() self.baseWidget.setLayout(self.catLayout) self.category_dock = QtWidgets.QDockWidget('Category selection') self.category_dock.setObjectName('category_selection') self.category_dock.setWidget(self.baseWidget) self.category_dock.setMaximumHeight(360)
def __init__(self, path = None): # Base window options. super(Viewer, self).__init__() self.setWindowTitle("SlicerVR - CAPS") self.setWindowIcon(QtGui.QIcon('icon.png')) self.resize(900, 600) self.file = None self._file_name = None # Pipeline-specific "constants" (defaults manipulated through options pane). self.HEIGHT_IN_PIXELS = 1024 self.WIDTH_IN_PIXELS = 1024 self.IMAGE_ROWS = 8 self.IMAGE_COLS = 8 self.DESIRED_SERIES = "DTI1" self.STD_DEV_ACROSS_N_FRAMES = 10 self.slicer_dir = r"C:\Users\loush\AppData\Local\NA-MIC\Slicer 4.11.0-2020-04-01" self.exportRan = False self.stdRan = False self.high_hu = 2000 self.low_hu = -1024 # self.pix_label = TrackingLabel(self) self.pix_label = DicomWidget(self) # self.color_table = [QtWidgets.qRgb(i, i, i) for i in range(256)] scroll_area = QtWidgets.QScrollArea() scroll_area.setWidget(self.pix_label) # self.setCentralWidget(self.pix_label) self.setCentralWidget(scroll_area) # self.series_dock = QtWidgets.QDockWidget("Series", self) # self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.series_dock) self.file_dock = QtWidgets.QDockWidget("Images", self) self.file_dock.setFeatures(QtWidgets.QDockWidget.DockWidgetMovable) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.file_dock) self.file_list = QtWidgets.QListWidget() self.file_list.itemSelectionChanged.connect(self.on_file_item_change) self.file_dock.setWidget(self.file_list) # self.series_list = QtWidgets.QListWidget() # self.studies_list.itemSelectionChanged.connect(self.on_study_item_change) # self.series_dock.setWidget(self.series_list) self.hu_label = QtWidgets.QLabel("No image") self.c_label = QtWidgets.QLabel("") self.cw_label = QtWidgets.QLabel("") self.x_label = QtWidgets.QLabel("") self.y_label = QtWidgets.QLabel("") self.z_label = QtWidgets.QLabel("") self.use_fractional_coordinates = True self.ij_label = QtWidgets.QLabel("") self._zoom_level = 1 self.mouse_x = -1 self.mouse_y = -1 self.statusBar().addPermanentWidget(self.cw_label) self.statusBar().addPermanentWidget(self.ij_label) self.statusBar().addPermanentWidget(self.x_label) self.statusBar().addPermanentWidget(self.y_label) self.statusBar().addPermanentWidget(self.z_label) self.statusBar().addPermanentWidget(self.hu_label) self.data = np.ndarray((512, 512), np.int8) self.update_cw() if os.path.isfile(path): self.load_files([path]) elif os.path.isdir(path): self.load_files(dicom_files_in_dir(path)) self.build_menu()
def __init__(self): super(MainWindow, self).__init__() self.setAcceptDrops(True) self.loader = None self.dirty = False self._selectSlotBlock = False self._config = config.get_default_config() self.labelListWidget = LabelListWidget(self) self.labelListDock = QtWidgets.QDockWidget('Displayed Label List', self) self.labelListDock.setWidget(self.labelListWidget) self.allLabelList = LabelListWidget(self) self.allLabelListDock = QtWidgets.QDockWidget('Label List', self) self.allLabelListDock.setWidget(self.allLabelList) self.colorTableWidget = TaglistWidget(self) self.colorTableWidget.loadFromJson(self._config['tags']) self.colorTableDock = QtWidgets.QDockWidget('Color Table', self) self.colorTableDock.setWidget(self.colorTableWidget) self.addDockWidget(Qt.RightDockWidgetArea, self.allLabelListDock) self.addDockWidget(Qt.RightDockWidgetArea, self.colorTableDock) self.tabifyDockWidget(self.allLabelListDock, self.labelListDock) self.view = BaseView() self.setCentralWidget(self.view) self.statusBar().show() self.resize(1200, 800) action = functools.partial(utils.createAction, self) open_ = action("&Open", self.open, 'open', self.tr('Open image or label file')) exit_ = action("&Exit", tip=self.tr('Quit Application')) openDir_ = action("&Open Dir", self.open, 'open') createMode_ = action("&Create Polygons", lambda: self.toggleDrawMode(type.Mode_polygon), 'objects', self.tr('Start drawing polygons')) createRectangleMode_ = action( self.tr('Create Rectangle'), lambda: self.toggleDrawMode(type.Mode_rectangle), 'objects', self.tr('Start drawing rectangles'), enabled=False, ) createCircleMode_ = action( self.tr('Create Circle'), lambda: self.toggleDrawMode(type.Mode_circle), 'objects', self.tr('Start drawing circles'), enabled=False, ) createLineMode_ = action( self.tr('Create Line'), lambda: self.toggleDrawMode(type.Mode_line), 'objects', self.tr('Start drawing lines'), enabled=False, ) createPointMode_ = action( self.tr('Create Point'), lambda: self.toggleDrawMode(type.Mode_point), 'objects', self.tr('Start drawing points'), enabled=False, ) createLineStripMode_ = action( self.tr('Create LineStrip'), lambda: self.toggleDrawMode(type.Mode_linestrip), 'objects', self.tr('Start drawing linestrip. Ctrl+LeftClick ends creation.'), enabled=False, ) createBoxMode_ = action( self.tr('Create Box'), lambda: self.toggleDrawMode(type.Mode_box), 'objects', self.tr('Start drawing box.'), enabled=False, ) delete_ = action(self.tr('Delete Polygons'), self.deleteSelectedShape, 'cancel', self.tr('Delete the selected polygons'), enabled=False) deleteAll_ = action(self.tr('Delete All'), self.deleteSelectedShape, 'delete', self.tr('Delete all polygons'), enabled=False) edit_ = action('&Edit Label', lambda: self.toggleDrawMode(None), 'edit', 'Modify the label of the selected polygon', enabled=False) save_ = action(self.tr('&Save'), self.saveFile, 'save', self.tr('Save labels to file'), enabled=False) saveAs_ = action(self.tr('&Save As'), self.saveFileAs, 'save-as', self.tr('Save labels to a different file'), enabled=False) nextTag_ = action( self.tr('&Next Tag'), slot=lambda: self.colorTableWidget.selectNext(), tip=self.tr('Go to a next tag'), ) prevTag_ = action( self.tr('&Previous Tag'), slot=lambda: self.colorTableWidget.selectPrev(), tip=self.tr('Go to a previous tag'), ) homeTag_ = action( self.tr('&Home Tag'), slot=lambda: self.colorTableWidget.selectHome(), tip=self.tr('Go to a start tag'), ) endTag_ = action( self.tr('&End Tag'), slot=lambda: self.colorTableWidget.selectEnd(), tip=self.tr('Go to a end tag'), ) deleteTag_ = action( self.tr('&Delete Tag'), slot=lambda: self.colorTableWidget.deleteSelected()) addTag_ = action(self.tr('&Add Tag'), slot=lambda: self.colorTableWidget.addTag()) insertTag_ = action(self.tr('&Insert Tag'), slot=lambda: self.colorTableWidget.insertTag()) fitWindow_ = action(self.tr('&Fit Window'), slot=self.fitWindow, icon='fit-window', tip=self.tr('Zoom follows window size')) undo_ = action(self.tr('&Undo'), slot=self.undo, icon='undo', tip=self.tr('undo')) self.zoom_widget = ZoomWidget() zoom_ = QtWidgets.QWidgetAction(self) zoom_.setDefaultWidget(self.zoom_widget) self.actions = utils.struct( open=open_, exit=exit_, openDir=openDir_, createMode=createMode_, createRectangleMode=createRectangleMode_, createCircleMode=createCircleMode_, createLineMode=createLineMode_, createPointMode=createPointMode_, createLineStripMode=createLineStripMode_, createBoxMode=createBoxMode_, edit=edit_, delete=delete_, save=save_, saveAs=saveAs_, nextTag=nextTag_, prevTag=prevTag_, homeTag=homeTag_, endTag=endTag_, deleteTag=deleteTag_, fitWindow=fitWindow_, deleteAll=deleteAll_, undo=undo_, # load=load_, fileMenu=( open_, openDir_, None, save_, saveAs_, None, # load_, None, exit_, ), editMenu=( createMode_, createRectangleMode_, createCircleMode_, createLineMode_, createPointMode_, createLineStripMode_, createBoxMode_, None, edit_, undo_, None, delete_, deleteAll_, ), selectionMenu=( nextTag_, prevTag_, homeTag_, endTag_, ), viewMenu=( self.labelListDock.toggleViewAction(), self.allLabelListDock.toggleViewAction(), self.colorTableDock.toggleViewAction(), None, fitWindow_, ), labelListMenu=(delete_, ), tagListMenu=( addTag_, insertTag_, deleteTag_, )) self.tools_actions = ( open_, openDir_, save_, saveAs_, None, delete_, deleteAll_, undo_, None, createMode_, edit_, None, zoom_, fitWindow_, ) self.toolbar = ToolBar('toolbar') self.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.addToolBar(Qt.TopToolBarArea, self.toolbar) utils.addActions(self.toolbar, self.tools_actions) # utils.addActions(self.canvas.menu, self.actions.editMenu) self.view.addMenu(self.actions.editMenu) self.labelListWidget.addMenu(self.actions.labelListMenu) self.allLabelList.addMenu(self.actions.labelListMenu) self.colorTableWidget.addMenu(self.actions.tagListMenu) self.addMenu("&File", self.actions.fileMenu) self.addMenu("&Edit", self.actions.editMenu) self.addMenu("&Selection", self.actions.selectionMenu) self.addMenu("&View", self.actions.viewMenu) # signal self.zoom_widget.valueChanged.connect(self.zoomChanged) self.labelListWidget.itemChanged.connect(self.labelItemChanged) self.labelListWidget.itemDoubleClicked.connect( lambda: (self.toggleDrawMode(None), self.labelSelectionChanged())) self.labelListWidget.itemSelectionChanged.connect( self.labelSelectionChanged) self.labelListWidget.itemDeleteSelected.connect( self.deleteSelectedShape) self.allLabelList.itemSelectionChanged.connect( self.allLabelListSelected) self.allLabelList.itemDoubleClicked.connect(self.editLabel) self.colorTableWidget.itemsDelete.connect(self.tagsDelete) self.init() self.initViewSlot()
def setup_ui(self, window): self.labelList = LabelQListWidget(window) self.labelList.itemActivated.connect(window.labelSelectionChanged) self.labelList.itemSelectionChanged.connect( window.labelSelectionChanged) self.labelList.itemDoubleClicked.connect(window.editLabel) # Connect to itemChanged to detect checkbox changes. self.labelList.itemChanged.connect(window.labelItemChanged) self.labelList.setDragDropMode( QtWidgets.QAbstractItemView.InternalMove) self.shape_dock = QtWidgets.QDockWidget('Polygon Labels', window) self.shape_dock.setObjectName('Labels') self.shape_dock.setWidget(self.labelList) self.uniqLabelList = EscapableQListWidget() self.uniqLabelList.setToolTip( "Select label to start annotating for it. " "Press 'Esc' to deselect.") if Config.get('labels'): self.uniqLabelList.addItems( set(Config.get('labels')) - {'__flags'}) self.uniqLabelList.sortItems() self.label_dock = QtWidgets.QDockWidget(u'Label List', window) self.label_dock.setObjectName(u'Label List') self.label_dock.setWidget(self.uniqLabelList) self.fileSearch = QtWidgets.QLineEdit() self.fileSearch.setPlaceholderText('Search Filename') self.fileListWidget = FileQListWidget(window.bound_to_new_uri, lambda: window.uri) self.fileListWidget.load_file_signal.connect(window.on_file_changed) self.fileSearch.textChanged.connect( self.fileListWidget.file_search_changed) fileListLayout = QtWidgets.QVBoxLayout() fileListLayout.setContentsMargins(0, 0, 0, 0) fileListLayout.setSpacing(0) fileListLayout.addWidget(self.fileSearch) fileListLayout.addWidget(self.fileListWidget) self.file_dock = QtWidgets.QDockWidget(u'File List', window) self.file_dock.setObjectName(u'Files') fileListSearchWidget = QtWidgets.QWidget() fileListSearchWidget.setLayout(fileListLayout) self.file_dock.setWidget(fileListSearchWidget) self.zoomWidget = ZoomWidget() self.colorDialog = ColorDialog(parent=window) self.canvas = self.labelList.canvas = Canvas() self.canvas.zoomRequest.connect(window.zoomRequest) self.labelDialog = LabelDialog(parent=self.canvas) scrollArea = QtWidgets.QScrollArea() scrollArea.setWidget(self.canvas) scrollArea.setWidgetResizable(True) self.scrollBars = { Qt.Vertical: scrollArea.verticalScrollBar(), Qt.Horizontal: scrollArea.horizontalScrollBar(), } self.canvas.scrollRequest.connect(window.scrollRequest) self.canvas.newShape.connect(window.newShape) self.canvas.shapeMoved.connect(window.setDirty) self.canvas.selectionChanged.connect(window.shapeSelectionChanged) self.canvas.drawingPolygon.connect(window.action_storage.refresh_all) self.canvas.mergeShape.connect(window.mergeShapes) window.setCentralWidget(scrollArea) features = QtWidgets.QDockWidget.DockWidgetFeatures() for dock in ['label_dock', 'shape_dock', 'file_dock']: if Config.get((dock, 'closable')): features = features | QtWidgets.QDockWidget.DockWidgetClosable if Config.get((dock, 'floatable')): features = features | QtWidgets.QDockWidget.DockWidgetFloatable if Config.get((dock, 'movable')): features = features | QtWidgets.QDockWidget.DockWidgetMovable getattr(self, dock).setFeatures(features) if Config.get((dock, 'show')) is False: getattr(self, dock).setVisible(False) window.addDockWidget(Qt.RightDockWidgetArea, self.label_dock) window.addDockWidget(Qt.RightDockWidgetArea, self.shape_dock) window.addDockWidget(Qt.RightDockWidgetArea, self.file_dock) shortcuts = Config.get('shortcuts') self.zoomWidget.setWhatsThis( 'Zoom in or out of the image. Also accessible with ' '{} and {} from the canvas.'.format( utils.fmtShortcut('{},{}'.format(shortcuts['zoom_in'], shortcuts['zoom_out'])), utils.fmtShortcut("Ctrl+Wheel"), )) self.zoomWidget.setEnabled(False) self.zoomWidget.valueChanged.connect(window.paintCanvas) # Lavel list context menu. labelMenu = QtWidgets.QMenu() self.labelList.setContextMenuPolicy(Qt.CustomContextMenu) self.labelList.customContextMenuRequested.connect( window.popLabelListMenu) self.menus = SimpleNamespace( file=self.menu(window, '&File'), edit=self.menu(window, '&Edit'), view=self.menu(window, '&View'), help=self.menu(window, '&Help'), recentFiles=QtWidgets.QMenu('Open &Recent'), labelList=labelMenu, ) self.menus.file.aboutToShow.connect(window.updateFileMenu) self.tools = self.toolbar(window, 'Tools')
def __init__(self, parent=None, flags=QtCore.Qt.WindowFlags(0)): QtWidgets.QMainWindow.__init__(self, parent, flags) self.statusBar().show() self.model = QtGui.QStandardItemModel(self) self.model.setColumnCount(2) self.treeview = QtWidgets.QTreeView() self.treeview.setModel(self.model) self.treeview.setHeaderHidden(True) self.treeview.setIndentation(0) self.treeview.setSelectionMode( QtWidgets.QAbstractItemView.ExtendedSelection) self.treeview.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.treeview.header().setStretchLastSection(True) self.treedock = QtWidgets.QDockWidget(self.tr('Layers View'), self) self.treedock.setWidget(self.treeview) self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.treedock) self.scene = QtWidgets.QGraphicsScene(self) self.graphicsview = QtWidgets.QGraphicsView(self.scene, self) self.setCentralWidget(self.graphicsview) self.mousemanager = MouseManager(self) self.mousemanager.register(self.graphicsview) self.mousemanager.mode = 'hand' self.layermanager = LayerManager(self.treeview, self) # File Actions self.fileactions = self._setupFileActions() menu = QtWidgets.QMenu('File', self) menu.addActions(self.fileactions.actions()) self.menuBar().addMenu(menu) self._filemenu = menu toolbar = QtWidgets.QToolBar('File toolbar', self) toolbar.addActions(self.fileactions.actions()) self.addToolBar(toolbar) # Mouse Actions menu = QtWidgets.QMenu('Mouse', self) menu.addActions(self.mousemanager.actions.actions()) self.menuBar().addMenu(menu) toolbar = QtWidgets.QToolBar('Mouse toolbar') toolbar.addActions(self.mousemanager.actions.actions()) self.addToolBar(toolbar) # View Actions self.viewactions = self._setupViewActions() menu = QtWidgets.QMenu('View', self) menu.addActions(self.viewactions.actions()) self.menuBar().addMenu(menu) toolbar = QtWidgets.QToolBar('View toolbar') toolbar.addActions(self.viewactions.actions()) self.addToolBar(toolbar) # Layer Actions layeractions = self.layermanager.actions menu = QtWidgets.QMenu('Layer', self) menu.addActions(layeractions.actions()) self.menuBar().addMenu(menu) toolbar = QtWidgets.QToolBar('Layer toolbar') toolbar.addActions(layeractions.actions()) self.addToolBar(toolbar) # Help action self.helpactions = self._setupHelpActions() menu = QtWidgets.QMenu('Help', self) menu.addActions(self.helpactions.actions()) self.menuBar().addMenu(menu) toolbar = QtWidgets.QToolBar('Help toolbar', self) toolbar.addActions(self.helpactions.actions()) self.addToolBar(toolbar) self.resize(900, 500) self.reset() self.statusBar().showMessage('Ready')