class SubWin(QMainWindow): count = 0 def __init__(self): super().__init__() self.initUI() def initUI(self): self.mdi = QMdiArea() self.setCentralWidget(self.mdi) self.toolBar = QToolBar() self.addToolBar(self.toolBar) self.toolBar.addAction("新建") self.toolBar.addAction("级联") self.toolBar.addAction("平铺") self.toolBar.addAction("关闭全部") self.toolBar.addAction("关闭活动窗口") self.toolBar.addAction("测试") self.toolBar.actionTriggered[QAction].connect(self.windowaction) bar = self.menuBar() file = bar.addMenu("File") # 添加子菜单 file.addAction("新建") file.addAction("级联") file.addAction("平铺") file.triggered[QAction].connect(self.windowaction) self.setWindowTitle("MDI Demo") #self.showFullScreen() #全屏显示 self.showMaximized() #窗口最大化 #self.showNormal() #正常显示 # self.setGeometry(QDesktopWidget().screenGeometry()) def windowaction(self, q): type = q.text() print("Triggered : %s" % type) if type == "新建": # 子窗口增加一个 self.count = self.count + 1 # 实例化多文档界面对象 sub = QMdiSubWindow() # 向sub内部添加控件 sub.setWidget(QTextEdit()) sub.setWindowTitle("subWindow %d" % self.count) self.mdi.addSubWindow(sub) sub.show() #sub.hide() elif type == "级联": self.mdi.cascadeSubWindows() elif type == "平铺": self.mdi.tileSubWindows() elif type == "关闭全部": self.mdi.closeAllSubWindows() elif type == "关闭活动窗口": self.mdi.closeActiveSubWindow() elif type == "测试": lst = self.mdi.subWindowList() print(lst) def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.mdi = QMdiArea() self.setCentralWidget(self.mdi) fileNewAction = self.createAction("&New", self.fileNew, QKeySequence.New, "filenew", "Create a text file") fileOpenAction = self.createAction("&Open...", self.fileOpen, QKeySequence.Open, "fileopen", "Open an existing text file") fileToolbar = self.addToolBar("File") fileToolbar.setObjectName("FileToolbar") self.addActions(fileToolbar, (fileNewAction, fileOpenAction)) def createAction(self, text, slot=None, shortcut=None, icon=None, tip=None, checkable=False, signal="triggered()"): action = QAction(text, self) if icon is not None: action.setIcon(QIcon(":/{0}.png".format(icon))) if shortcut is not None: action.setShortcut(shortcut) if tip is not None: action.setToolTip(tip) action.setStatusTip(tip) if slot is not None: action.triggered.connect(slot) if checkable: action.setCheckable(True) return action def addActions(self, target, actions): for action in actions: if action is None: target.addSeparator() else: target.addAction(action) #@profile def fileNew(self): try: print( u'openSystemConfig内存使用:', round( psutil.Process(getpid()).memory_info().rss / 1024 / 1024, 4)) #print(u'memory_info:', psutil.Process(getpid()).memory_info()) #print(u'memory_info:', psutil.Process(getpid()).memory_full_info()) objgraph.show_growth(shortnames=False) #templist = objgraph.by_type('QIcon') #print('objgraph.by_type:', templist) #if len(templist) >= 1: # objgraph.show_backrefs(templist[-1], filename='obj.png') # textEdit = textedit.TextEdit() #self.systemConfigWindow = Ui_QSystemConfigWindow() #a = sys.getrefcount(self.systemConfigWindow) #self.mdi.addSubWindow(self.systemConfigWindow).show() #self.mdi.closeActiveSubWindow() #self.systemConfigWindow.systemConfigInfoSignal.connect(self.setSystemConfigInfo) #self.systemConfigWindow.pushbuttonOKOnActivated() self.taskConfigWindow = Ui_QTaskConfigWindow() self.mdi.addSubWindow(self.taskConfigWindow).show() #self.mdi.closeActiveSubWindow() #self.systemConfigWindow = None #self.taskConfigWindow = None #templist = None ''' sleep(5) self.taskConfigWindow = Ui_QTaskConfigWindow() self.mdi.addSubWindow(self.taskConfigWindow).show() self.taskConfigWindow.systemConfigInfo = self.systemConfigInfo # textEdit.close() sleep(5) for win_temp in self.mdi.subWindowList(): win_temp_widget = win_temp.widget() if (win_temp_widget is not None) and (isinstance(win_temp_widget, Ui_QTaskConfigWindow)): self.mdi.setActiveSubWindow(win_temp) self.mdi.closeActiveSubWindow() elif (win_temp_widget is not None) and (isinstance(win_temp_widget, Ui_QSystemConfigWindow)): self.mdi.setActiveSubWindow(win_temp) #self.mdi.removeSubWindow(self.systemConfigWindow) self.mdi.closeActiveSubWindow() #self.mdi.removeSubWindow(self.systemConfigWindow) #b = sys.getrefcount(self.systemConfigWindow) win_temp = None win_temp_widget = None self.systemConfigInfo = None self.systemConfigWindow = None self.taskConfigWindow = None ''' except Exception as e: print(print_exc()) def fileOpen(self): #self.mdi.closeActiveSubWindow() #self.taskConfigWindow = Ui_QTaskConfigWindow() #self.mdi.addSubWindow(self.taskConfigWindow).show() #self.taskConfigWindow.systemConfigInfo = self.systemConfigInfo self.fileSave() def fileSave(self): for win_temp in self.mdi.subWindowList(): win_temp_widget = win_temp.widget() if (win_temp_widget is not None) and (isinstance( win_temp_widget, Ui_QTaskConfigWindow)): self.mdi.setActiveSubWindow(win_temp) self.mdi.closeActiveSubWindow() elif (win_temp_widget is not None) and (isinstance( win_temp_widget, Ui_QSystemConfigWindow)): self.mdi.setActiveSubWindow(win_temp) # self.mdi.removeSubWindow(self.systemConfigWindow) self.mdi.closeActiveSubWindow() # self.mdi.removeSubWindow(self.systemConfigWindow) # b = sys.getrefcount(self.systemConfigWindow) #win_temp = None #win_temp_widget = None self.systemConfigInfo = None self.systemConfigWindow = None self.taskConfigWindow = None
class ObjectTab(QWidget): """ This class constructs the entire contents of the Object tab. """ def __init__(self, inspector, dither, detector, object_id, *args): super().__init__(*args) self._inspector = inspector self._dither = dither # remove self._detector = detector # remove self._object_id = object_id self.contents = list() self.setMouseTracking(True) self.plot_selector = PlotSelector(self) detectors = self.determine_relevant_detectors(object_id) selector_area = MultiDitherDetectorSelector(detectors) selector_area.updated.connect(self.update_plot_button) self.mdi = QMdiArea(self) self.mdi.setContentsMargins(0, 0, 0, 0) self.mdi.setBackground(QBrush(QColor('#56595e'))) h_layout = QGridLayout() h_layout.setSpacing(0) h_layout.setContentsMargins(0, 0, 0, 0) h_layout.addWidget(selector_area, 0, 0) h_layout.setAlignment(selector_area, Qt.AlignTop) h_layout.addWidget(self.mdi, 0, 1) h_layout.setColumnStretch(0, 0) h_layout.setColumnStretch(1, 10) self.detector_selector = selector_area v_layout = QVBoxLayout() v_layout.setSpacing(0) v_layout.addWidget(self.plot_selector) v_layout.addItem(h_layout) self.setLayout(v_layout) self.setContentsMargins(0, 0, 0, 0) self._spec_plots = None self._plot_descriptors = set() self._info_window = None @property def object_id(self): return self._object_id @property def dither(self): return self._dither @property def detector(self): return self._detector @property def inspector(self): return self._inspector def make_plots(self): self._spec_plots = SpecPlot(self._inspector, self.plot_selector, self.detector_selector) self._spec_plots.make_plots(self._object_id) for window in self._spec_plots.windows: if window.descriptor not in self._plot_descriptors: self.mdi.addSubWindow(window) self._plot_descriptors.add(window.descriptor) window.closing.connect(self.handle_closed_subwindow) window.activateWindow() window.show() def show_info(self): if self._inspector.location_tables is not None: info = self._inspector.location_tables.get_info(self._object_id) info_window = ObjectInfoWindow(info, self._inspector) self.mdi.addSubWindow(info_window) info_window.activateWindow() info_window.show() self._info_window = info_window else: m = QMessageBox(0, 'Missing Data', 'Location tables containing the requested information must be loaded before showing info.') m.exec() def determine_relevant_detectors(self, object_id): """ Returns the detectors in which the spectra of the object can be found, in the format {dither: [detectors]} """ detectors = {} for dither in self._inspector.spectra[object_id]: detectors[dither] = list(self._inspector.spectra[object_id][dither].keys()) for d in (1, 2, 3, 4): if d not in detectors: detectors[d] = [] return detectors def update_plot_button(self): selected = list(self.detector_selector.selected_detectors().values()) if all(item is None for item in selected): self.plot_selector.plot_button.setDisabled(True) self.plot_selector.detector_button.setDisabled(True) else: self.plot_selector.detector_button.setEnabled(True) self.plot_selector.plot_button.setEnabled(True) def handle_closed_subwindow(self, descriptor): if descriptor in self._plot_descriptors: self._plot_descriptors.remove(descriptor) active_window = self.mdi.activeSubWindow() if active_window is not None and descriptor == active_window.widget().descriptor: self.mdi.closeActiveSubWindow() def open_detectors(self): selected_detectors = self.detector_selector.selected_detectors() inspector = self._inspector # make a list of all open detectors (detectors currently being viewed in tabs) open_detectors = [] for tab_index in range(inspector.tabs.count()): tab = inspector.tabs.widget(tab_index) if isinstance(tab, ViewTab): open_detectors.append((tab.current_dither, tab.current_detector)) # open new tabs, where necessary for dither in selected_detectors: if selected_detectors[dither] is not None: for detector in selected_detectors[dither]: if (dither, detector) not in open_detectors: inspector.new_view_tab(dither, detector) # pin the object in all tabs: for tab_index in range(inspector.tabs.count()): tab = inspector.tabs.widget(tab_index) if isinstance(tab, ViewTab): tab.select_spectrum_by_id(self._object_id)
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.mdi = QMdiArea() self.setCentralWidget(self.mdi) fileNewAction = self.createAction("&New", self.fileNew, QKeySequence.New, "filenew", "Create a text file") fileOpenAction = self.createAction("&Open...", self.fileOpen, QKeySequence.Open, "fileopen", "Open an existing text file") fileToolbar = self.addToolBar("File") fileToolbar.setObjectName("FileToolbar") self.addActions(fileToolbar, (fileNewAction, fileOpenAction)) def createAction(self, text, slot=None, shortcut=None, icon=None, tip=None, checkable=False, signal="triggered()"): action = QAction(text, self) if icon is not None: action.setIcon(QIcon(":/{0}.png".format(icon))) if shortcut is not None: action.setShortcut(shortcut) if tip is not None: action.setToolTip(tip) action.setStatusTip(tip) if slot is not None: action.triggered.connect(slot) if checkable: action.setCheckable(True) return action def addActions(self, target, actions): for action in actions: if action is None: target.addSeparator() else: target.addAction(action) #@profile def fileNew(self): try: print( u'openSystemConfig内存使用:', round( psutil.Process(getpid()).memory_info().rss / 1024 / 1024, 4)) objgraph.show_growth(shortnames=False) self.taskConfigWindow = Ui_QTaskConfigWindow() self.mdi.addSubWindow(self.taskConfigWindow).show() except Exception as e: print(print_exc()) def fileOpen(self): for win_temp in self.mdi.subWindowList(): win_temp_widget = win_temp.widget() if (win_temp_widget is not None) and (isinstance( win_temp_widget, Ui_QTaskConfigWindow)): self.mdi.setActiveSubWindow(win_temp) self.mdi.closeActiveSubWindow() self.taskConfigWindow = None