class NetMainWindow(QMainWindow): def __init__(self): super(NetMainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createStatusBar() self.readSettings() self.setWindowTitle('Net') def newScan(self): child = IpRangeScanGUI(self) self.mdiArea.addSubWindow(child) child.show() return child def createActions(self): self.newIPScanAct = QAction("&Start a Scan", self, shortcut=QKeySequence.New, statusTip="Start a Scan", triggered=self.newScan) def createMenus(self): self.serverMenu = self.menuBar().addMenu('&IP Scan') self.serverMenu.addAction(self.newIPScanAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def readSettings(self): settings = QSettings('Trolltech', 'MDI Example') pos = settings.value('pos', QPoint(200, 200)) size = settings.value('size', QSize(500, 500)) self.move(pos) self.resize(size) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window)
class NetMainWindow(QMainWindow): def __init__(self): super(NetMainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createStatusBar() self.readSettings() self.setWindowTitle('Net') def newScan(self): child = IpRangeScanGUI(self) self.mdiArea.addSubWindow(child) child.show() return child def createActions(self): self.newIPScanAct = QAction("&Start a Scan", self, shortcut=QKeySequence.New, statusTip="Start a Scan", triggered=self.newScan) def createMenus(self): self.serverMenu = self.menuBar().addMenu('&IP Scan') self.serverMenu.addAction(self.newIPScanAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def readSettings(self): settings = QSettings('Trolltech', 'MDI Example') pos = settings.value('pos', QPoint(200, 200)) size = settings.value('size', QSize(500, 500)) self.move(pos) self.resize(size) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window)
class MainWindow(QMainWindow): """This create the main window of the application""" def __init__(self): super(MainWindow, self).__init__() # remove close & maximize window buttons #self.setWindowFlags(Qt.CustomizeWindowHint|Qt.WindowMinimizeButtonHint) self.setMinimumSize(500, 666) #self.setMaximumSize(1000,666) self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.mdiArea.setViewMode(QMdiArea.TabbedView) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.child = None self.createActions() self.createMenus() self.createStatusBar() self.updateMenus() self.readSettings() self.setWindowTitle("LEKTURE") mytoolbar = QToolBar() #self.toolbar = self.addToolBar() mytoolbar.addAction(self.newAct) mytoolbar.addAction(self.openAct) mytoolbar.addAction(self.saveAct) mytoolbar.addAction(self.saveAsAct) mytoolbar.addSeparator() mytoolbar.addAction(self.outputsAct) mytoolbar.addAction(self.scenarioAct) self.scenarioAct.setVisible(False) mytoolbar.setMovable(False) mytoolbar.setFixedWidth(60) self.addToolBar(Qt.LeftToolBarArea, mytoolbar) def closeEvent(self, scenario): """method called when the main window wants to be closed""" self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): scenario.ignore() else: self.writeSettings() scenario.accept() def newFile(self): """creates a new project""" child = self.createProjekt() child.newFile() child.show() self.child = child def open(self): """open a project""" fileName, _ = QFileDialog.getOpenFileName(self) if fileName: existing = self.findProjekt(fileName) if existing: self.mdiArea.setActiveSubWindow(existing) return child = self.createProjekt() if child.loadFile(fileName): self.statusBar().showMessage("File loaded", 2000) child.show() else: child.close() def save(self): """called when user save a project""" if self.activeProjekt() and self.activeProjekt().save(): self.statusBar().showMessage("File saved", 2000) else: self.statusBar().showMessage("Error when trying to save the file") def saveAs(self): """called when user save AS a project""" if self.activeProjekt() and self.activeProjekt().saveAs(): self.statusBar().showMessage("File saved", 2000) else: self.statusBar().showMessage("Error when trying to save the file") def openFolder(self): """called when user calls 'reveal in finder' function""" if self.activeProjekt() and self.activeProjekt().openFolder(): self.statusBar().showMessage("File revealed in Finder", 2000) def about(self): """called when user wants to know a bit more on the app""" import sys python_version = str(sys.version_info[0]) python_version_temp = sys.version_info[1:5] for item in python_version_temp: python_version = python_version + "." + str(item) QMessageBox.about(self, "About Lekture", "pylekture build " + str(pylekture.__version__ + "\n" + \ "python version " + str(python_version))) def updateMenus(self): """update menus""" hasProjekt = (self.activeProjekt() is not None) self.saveAct.setEnabled(hasProjekt) self.saveAsAct.setEnabled(hasProjekt) self.outputsAct.setEnabled(hasProjekt) self.scenarioAct.setEnabled(hasProjekt) self.openFolderAct.setEnabled(hasProjekt) self.closeAct.setEnabled(hasProjekt) self.closeAllAct.setEnabled(hasProjekt) self.nextAct.setEnabled(hasProjekt) self.previousAct.setEnabled(hasProjekt) self.separatorAct.setVisible(hasProjekt) def updateWindowMenu(self): """unpates menus on the window toolbar""" self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.activeProjekt()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def createProjekt(self): """create a new project""" child = Projekt() self.mdiArea.addSubWindow(child) self.child = child return child def createActions(self): """create all actions""" self.newAct = QAction("&New", self, shortcut=QKeySequence.New, statusTip="Create a new file", triggered=self.newFile) self.openAct = QAction("&Open...", self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.open) self.saveAct = QAction("&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk", triggered=self.save) self.saveAsAct = QAction("Save &As...", self, shortcut=QKeySequence.SaveAs, statusTip="Save the document under a new name", triggered=self.saveAs) self.openFolderAct = QAction("Open Project Folder", self, statusTip="Reveal Project in Finder", triggered=self.openFolder) self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit, statusTip="Exit the application", triggered=QApplication.instance().closeAllWindows) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.outputsAct = QAction("Outputs", self, statusTip="Open the outputs panel", triggered=self.openOutputsPanel) self.scenarioAct = QAction("Scenario", self, statusTip="Open the scenario panel", triggered=self.openScenarioPanel) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction("Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) self.aboutAct = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) def createMenus(self): """create all menus""" self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.saveAct) self.fileMenu.addAction(self.saveAsAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.openFolderAct) self.fileMenu.addAction(self.exitAct) self.viewMenu = self.menuBar().addMenu("&View") self.viewMenu.addAction(self.outputsAct) self.viewMenu.addAction(self.scenarioAct) self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) def createStatusBar(self): """create the status bar""" self.statusBar().showMessage("Ready") def readSettings(self): """read the settings""" settings = QSettings('Pixel Stereo', 'lekture') pos = settings.value('pos', QPoint(200, 200)) size = settings.value('size', QSize(1000, 650)) self.move(pos) self.resize(size) def writeSettings(self): """write settings""" settings = QSettings('Pixel Stereo', 'lekture') settings.setValue('pos', self.pos()) settings.setValue('size', self.size()) def activeProjekt(self): """return the active project object""" activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() else: return None def findProjekt(self, fileName): """return the project""" canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def setActiveSubWindow(self, window): """set the active sub window""" if window: self.mdiArea.setActiveSubWindow(window) def openOutputsPanel(self): """switch to the outputs editor""" if self.child: project = self.activeProjekt() project.scenario_events_group.setVisible(False) project.outputs_group.setVisible(True) self.scenarioAct.setVisible(True) self.outputsAct.setVisible(False) def openScenarioPanel(self): """switch to the scenario editors""" if self.child: project = self.activeProjekt() project.outputs_group.setVisible(False) project.scenario_events_group.setVisible(True) self.scenarioAct.setVisible(False) self.outputsAct.setVisible(True)
class MainWindow(object): def __init__(self): self.main_window_tab_table = QTabWidget() self.hbox = QHBoxLayout() self.but = QPushButton('Add') self.file_menu = None self.help_menu = None self.about_qt = None self.exit_action = None self.choice_interface = None def setup_ui(self, main_window): self.main_window = main_window main_window.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) red, green, blue = 11, 7, 11 main_window.setPalette(QPalette(QColor(red, green, blue))) self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.create_menu(main_window) self.create_tool_bars(main_window) main_window.setCentralWidget(self.mdiArea) self.windowMapper = QSignalMapper(main_window) def file_menu_action(self): self.exit_action = QAction(QIcon('../resources/icons/fileclose.png'), "&Exit", self.file_menu) self.exit_action.setShortcut('Ctrl+Q') self.exit_action.setStatusTip('Exit application') # self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit, # statusTip="Exit the application", # triggered=QApplication.instance().closeAllWindows) self.choice_interface = QAction(QIcon('../resources/icons/ethernet_card_vista.png'), '&New Table', self.file_menu) self.choice_interface.setShortcut('Ctrl+A') self.choice_interface.setStatusTip('Exit application') # create new table self.new_act = QAction(QIcon(':/images/new.png'), "&New", self.file_menu) self.new_act.setShortcut('Ctrl+Q') self.new_act.setStatusTip('Create a new file') # triggered=self.open self.open_act = QAction(QIcon(':/images/open.png'), "&Open", self.file_menu) self.open_act.setShortcut(QKeySequence.Open) self.open_act.setStatusTip('Open an existing file') # triggered=self.save self.save_act = QAction(QIcon(':/images/save.png'), "&Save", self.file_menu) self.save_act.setShortcut(QKeySequence.Save) self.save_act.setStatusTip('Save the table to disk') # triggered=self.saveAs self.save_as_act = QAction(QIcon(':/images/save.png'), "&Save &As", self.file_menu) self.save_as_act.setShortcut(QKeySequence.SaveAs) self.save_as_act.setStatusTip('Save the document under a new name') # triggered=self.cut self.cut_act = QAction(QIcon(':/images/save.png'), "&Cut", self.file_menu) self.cut_act.setShortcut(QKeySequence.Cut) self.cut_act.setStatusTip('Cut the current selections contents to the clipboard') # triggered=self.copy self.copy_act = QAction(QIcon(':/images/save.png'), "&Copy", self.file_menu) self.copy_act.setShortcut(QKeySequence.Copy) self.copy_act.setStatusTip('Copy the current selections contents to the clipboard') # triggered=self.paste self.paste_act = QAction(QIcon(':/images/save.png'), "&Paste", self.file_menu) self.paste_act.setShortcut(QKeySequence.Paste) self.paste_act.setStatusTip('Paste the clipboards contents into the current selection') self.close_act = QAction(QIcon(':/images/save.png'), "&Close", self.file_menu) self.close_act.setStatusTip('Close the active window') self.close_act.triggered.connect(self.mdiArea.closeActiveSubWindow) self.close_all_act = QAction(QIcon(':/images/save.png'), "&Close &All", self.file_menu) self.close_all_act.setStatusTip('Close all the windows') self.close_all_act.triggered.connect(self.mdiArea.closeAllSubWindows) self.tile_act = QAction(QIcon(':/images/save.png'), "&Tile", self.file_menu) self.tile_act.setStatusTip('Tile the windows') self.tile_act.triggered.connect(self.mdiArea.tileSubWindows) self.cascade_act = QAction(QIcon(':/images/save.png'), "&Cascade", self.file_menu) self.cascade_act.setStatusTip('Cascade the windows') self.cascade_act.triggered.connect(self.mdiArea.cascadeSubWindows) self.next_act = QAction(QIcon(':/images/save.png'), "&Next", self.file_menu) self.next_act.setShortcut(QKeySequence.NextChild) self.next_act.setStatusTip('Move the focus to the next window') self.next_act.triggered.connect(self.mdiArea.activateNextSubWindow) self.previous_act = QAction(QIcon(':/images/save.png'), "&Previous", self.file_menu) self.previous_act.setShortcut(QKeySequence.PreviousChild) self.previous_act.setStatusTip('Move the focus to the previous window') self.previous_act.triggered.connect(self.mdiArea.activatePreviousSubWindow) # triggered=self.about # self.separatorAct = QAction(self) # self.separatorAct.setSeparator(True) def help_menu_action(self): self.about_qt = QAction(QIcon('../resources/icons/info.png'), '&About Qt', self.help_menu) self.about_qt.setShortcut('Ctrl+L') self.about_qt.setStatusTip('Show the Qt librarys About box') self.about_qt.triggered.connect(qApp.aboutQt) # self.aboutQtAct = QAction("About &Qt", self, # statusTip="Show the Qt library's About box", # triggered=QApplication.instance().aboutQt) self.about_program_act = QAction(QIcon(':/images/save.png'), "&About Program", self.file_menu) self.about_program_act.setStatusTip('Show the applications About box') def create_menu(self, main_window): self.file_menu = main_window.menuBar().addMenu("&File") self.file_menu_action() self.file_menu.addAction(self.choice_interface) self.file_menu.addAction(self.exit_action) self.file_menu.addAction(self.new_act) self.file_menu.addAction(self.open_act) self.file_menu.addAction(self.save_act) self.file_menu.addAction(self.save_as_act) # self.fileMenu.addSeparator() self.help_menu = main_window.menuBar().addMenu("&Help") self.help_menu_action() self.help_menu.addAction(self.about_qt) self.help_menu.addAction(self.about_program_act) self.editMenu = main_window.menuBar().addMenu("&Edit") self.editMenu.addAction(self.cut_act) self.editMenu.addAction(self.copy_act) self.editMenu.addAction(self.paste_act) self.windowMenu = main_window.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) # self.menuBar().addSeparator() def about(self): QMessageBox.about(self, "About MDI", "The <b>MDI</b> example demonstrates how to write multiple " "document interface applications using Qt.") def updateMenus(self): hasMdiChild = (self.activeMdiChild() is not None) self.save_act.setEnabled(hasMdiChild) self.save_as_act.setEnabled(hasMdiChild) self.paste_act.setEnabled(hasMdiChild) self.close_act.setEnabled(hasMdiChild) self.close_all_act.setEnabled(hasMdiChild) self.tile_act.setEnabled(hasMdiChild) self.cascade_act.setEnabled(hasMdiChild) self.next_act.setEnabled(hasMdiChild) self.previous_act.setEnabled(hasMdiChild) # self.separator_act.setVisible(hasMdiChild) hasSelection = (self.activeMdiChild() is not None and self.activeMdiChild().textCursor().hasSelection()) self.cut_act.setEnabled(hasSelection) self.copy_act.setEnabled(hasSelection) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.close_act) self.windowMenu.addAction(self.close_all_act) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tile_act) self.windowMenu.addAction(self.cascade_act) self.windowMenu.addSeparator() self.windowMenu.addAction(self.next_act) self.windowMenu.addAction(self.previous_act) # self.windowMenu.addAction(self.separator_act) windows = self.mdiArea.subWindowList() # self.separator_act.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.main_window.activeMdiChild()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) # def switchLayoutDirection(self): # if self.layoutDirection() == Qt.LeftToRight: # QApplication.setLayoutDirection(Qt.RightToLeft) # else: # QApplication.setLayoutDirection(Qt.LeftToRight) ''' def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.saveAct) self.fileMenu.addAction(self.saveAsAct) self.fileMenu.addSeparator() action = self.fileMenu.addAction("Switch layout direction") action.triggered.connect(self.switchLayoutDirection) self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) ''' def create_tool_bars(self, main_window): self.file_tool_bar = main_window.addToolBar("File") self.file_tool_bar.addAction(self.new_act) self.file_tool_bar.addAction(self.open_act) self.file_tool_bar.addAction(self.save_act) self.edit_tool_bar = main_window.addToolBar("Edit") self.edit_tool_bar.addAction(self.cut_act) self.edit_tool_bar.addAction(self.copy_act) self.edit_tool_bar.addAction(self.paste_act)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.updateMenus() self.readSettings() self.setWindowTitle("MDI") def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: self.writeSettings() event.accept() def newFile(self): child = self.createMdiChild() child.newFile() child.show() def open(self): fileName, _ = QFileDialog.getOpenFileName(self) if fileName: existing = self.findMdiChild(fileName) if existing: self.mdiArea.setActiveSubWindow(existing) return child = self.createMdiChild() if child.loadFile(fileName): self.statusBar().showMessage("File loaded", 2000) child.show() else: child.close() def save(self): if self.activeMdiChild() and self.activeMdiChild().save(): self.statusBar().showMessage("File saved", 2000) def saveAs(self): if self.activeMdiChild() and self.activeMdiChild().saveAs(): self.statusBar().showMessage("File saved", 2000) def cut(self): if self.activeMdiChild(): self.activeMdiChild().cut() def copy(self): if self.activeMdiChild(): self.activeMdiChild().copy() def paste(self): if self.activeMdiChild(): self.activeMdiChild().paste() def about(self): QMessageBox.about( self, "About MDI", "The <b>MDI</b> example demonstrates how to write multiple " "document interface applications using Qt.") def updateMenus(self): hasMdiChild = (self.activeMdiChild() is not None) self.saveAct.setEnabled(hasMdiChild) self.saveAsAct.setEnabled(hasMdiChild) self.pasteAct.setEnabled(hasMdiChild) self.closeAct.setEnabled(hasMdiChild) self.closeAllAct.setEnabled(hasMdiChild) self.tileAct.setEnabled(hasMdiChild) self.cascadeAct.setEnabled(hasMdiChild) self.nextAct.setEnabled(hasMdiChild) self.previousAct.setEnabled(hasMdiChild) self.separatorAct.setVisible(hasMdiChild) hasSelection = (self.activeMdiChild() is not None and self.activeMdiChild().textCursor().hasSelection()) self.cutAct.setEnabled(hasSelection) self.copyAct.setEnabled(hasSelection) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tileAct) self.windowMenu.addAction(self.cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.activeMdiChild()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def createMdiChild(self): child = MdiChild() self.mdiArea.addSubWindow(child) child.copyAvailable.connect(self.cutAct.setEnabled) child.copyAvailable.connect(self.copyAct.setEnabled) return child def createActions(self): self.newAct = QAction(QIcon(':/images/new.png'), "&New", self, shortcut=QKeySequence.New, statusTip="Create a new file", triggered=self.newFile) self.openAct = QAction(QIcon(':/images/open.png'), "&Open...", self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.open) self.saveAct = QAction(QIcon(':/images/save.png'), "&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk", triggered=self.save) self.saveAsAct = QAction( "Save &As...", self, shortcut=QKeySequence.SaveAs, statusTip="Save the document under a new name", triggered=self.saveAs) self.exitAct = QAction( "E&xit", self, shortcut=QKeySequence.Quit, statusTip="Exit the application", triggered=QApplication.instance().closeAllWindows) self.cutAct = QAction( QIcon(':/images/cut.png'), "Cu&t", self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection's contents to the clipboard", triggered=self.cut) self.suggestAct = QAction( "Suggest", self, shortcut=QKeySequence.Copy, statusTip="Cut the current selection's contents to the clipboard", triggered=self.copy) self.copyAct = QAction( QIcon(':/images/copy.png'), "&Copy", self, shortcut=QKeySequence.Copy, statusTip="Copy the current selection's contents to the clipboard", triggered=self.copy) self.pasteAct = QAction( QIcon(':/images/paste.png'), "&Paste", self, shortcut=QKeySequence.Paste, statusTip= "Paste the clipboard's contents into the current selection", triggered=self.paste) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.tileAct = QAction("&Tile", self, statusTip="Tile the windows", triggered=self.mdiArea.tileSubWindows) self.cascadeAct = QAction("&Cascade", self, statusTip="Cascade the windows", triggered=self.mdiArea.cascadeSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction( "Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) self.aboutAct = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, statusTip="Show the Qt library's About box", triggered=QApplication.instance().aboutQt) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.saveAct) self.fileMenu.addAction(self.saveAsAct) self.fileMenu.addSeparator() action = self.fileMenu.addAction("Switch layout direction") action.triggered.connect(self.switchLayoutDirection) self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.fileToolBar = self.addToolBar("File") self.fileToolBar.addAction(self.newAct) self.fileToolBar.addAction(self.openAct) self.fileToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar("Edit") self.editToolBar.addAction(self.cutAct) self.editToolBar.addAction(self.copyAct) self.editToolBar.addAction(self.pasteAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def readSettings(self): settings = QSettings('Trolltech', 'MDI Example') pos = settings.value('pos', QPoint(200, 200)) size = settings.value('size', QSize(400, 400)) self.move(pos) self.resize(size) def writeSettings(self): settings = QSettings('Trolltech', 'MDI Example') settings.setValue('pos', self.pos()) settings.setValue('size', self.size()) def activeMdiChild(self): activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() return None def findMdiChild(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def switchLayoutDirection(self): if self.layoutDirection() == Qt.LeftToRight: QApplication.setLayoutDirection(Qt.RightToLeft) else: QApplication.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window) def contextMenuEvent(self, event): menu = QMenu(self) menu.addAction(self.cutAct) menu.addAction(self.copyAct) menu.addAction(self.pasteAct) menu.addAction(self.suggestAct) menu.exec_(event.globalPos())
class MainWindow(QMainWindow): """This create the main window of the application""" def __init__(self): super(MainWindow, self).__init__() self.ports = serial.listports() self.port = None # remove close & maximize window buttons #self.setWindowFlags(Qt.CustomizeWindowHint|Qt.WindowMinimizeButtonHint) self.setMinimumSize(850, 450) self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.mdiArea.setViewMode(QMdiArea.TabbedView) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.child = None self.createActions() self.createMenus() self.createStatusBar() self.updateMenus() self.readSettings() self.setWindowTitle("VISCAM") mytoolbar = QToolBar() ports_menu = QComboBox() ports_menu.addItem('Output Port') ports_menu.insertSeparator(1) for port in self.ports: ports_menu.addItem(port) self.ports_menu = ports_menu ports_menu.currentTextChanged.connect(self.setActivePort) mytoolbar.addWidget(ports_menu) mytoolbar.addSeparator() mytoolbar.setMovable(False) mytoolbar.setFixedHeight(60) self.addToolBar(Qt.TopToolBarArea, mytoolbar) def closeEvent(self, scenario): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): scenario.ignore() else: self.writeSettings() scenario.accept() def about(self): QMessageBox.about( self, "About Viscam", "<b>Viscam</b> controls and manage your video camera through VISCA protocol." "This release is an alpha version. Don't use it in production !!") def updateMenus(self): hasCamera = (self.activeCamera() is not None) self.nextAct.setEnabled(hasCamera) self.previousAct.setEnabled(hasCamera) self.separatorAct.setVisible(hasCamera) def updatePortMenu(self): self.PortMenu.clear() for i, port in enumerate(self.ports): text = "%d %s" % (i + 1, port) if i < 9: text = '&' + text action = self.PortMenu.addAction(text) action.setCheckable(True) if port == self.port: action.setChecked(True) action.triggered.connect(self.setActivePort) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.activeCamera()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def createCamera(self): child = Camera(serial) self.mdiArea.addSubWindow(child) child.newFile() self.child = child return child def createActions(self): self.exitAct = QAction( "E&xit", self, shortcut=QKeySequence.Quit, statusTip="Exit the application", triggered=QApplication.instance().closeAllWindows) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction( "Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) self.aboutAct = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.exitAct) self.PortMenu = self.menuBar().addMenu("&Ports") self.updatePortMenu() self.PortMenu.aboutToShow.connect(self.updatePortMenu) self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def readSettings(self): settings = QSettings('Pixel Stereo', 'viscam') port = settings.value('port') pos = settings.value('pos', QPoint(200, 200)) size = settings.value('size', QSize(1000, 650)) self.move(pos) self.resize(size) def writeSettings(self): settings = QSettings('Pixel Stereo', 'viscam') settings.setValue('port', self.port) settings.setValue('pos', self.pos()) settings.setValue('size', self.size()) def activeCamera(self): activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() else: return None def findCamera(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window) def setActivePort(self): self.port = self.ports_menu.currentText().encode('utf-8') self.updatePortMenu() serial.open(portname=self.port) viscams = _cmd_adress_set(serial) _if_clear(serial) for v in viscams: v = self.createCamera()
class CalculatorWindow(NodeEditorWindow): """Class representing the MainWindow of the application. Instance Attributes: name_company and name_product - used to register the settings """ def initUI(self): """UI is composed with """ # variable for QSettings self.name_company = 'Michelin' self.name_product = 'Calculator NodeEditor' # Load filesheets self.stylesheet_filename = os.path.join(os.path.dirname(__file__), 'qss/nodeeditor.qss') loadStylessheets( os.path.join(os.path.dirname(__file__), 'qss/nodeeditor-dark.qss'), self.stylesheet_filename) self.empty_icon = QIcon(".") if DEBUG: print('Registered Node') pp(CALC_NODES) # Instantiate the MultiDocument Area self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setViewMode(QMdiArea.TabbedView) self.mdiArea.setTabsClosable(True) self.setCentralWidget(self.mdiArea) # Connect subWindowActivate to updateMenu # Activate the items on the file_menu and the edit_menu self.mdiArea.subWindowActivated.connect(self.updateMenus) # from mdi example... self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) # instantiate various elements self.createNodesDock() self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.updateMenus() self.readSettings() self.setWindowTitle("Calculator NodeEditor Example") def createActions(self): """Instantiate various `QAction` for the main toolbar. File and Edit menu actions are instantiated in the :classs:~`node_editor.node_editor_widget.NodeEditorWidget` Window and Help actions are specific to the :class:~`examples.calc_window.CalcWindow` """ super().createActions() self.actClose = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.actCloseAll = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.actTile = QAction("&Tile", self, statusTip="Tile the windows", triggered=self.mdiArea.tileSubWindows) self.actCascade = QAction("&Cascade", self, statusTip="Cascade the windows", triggered=self.mdiArea.cascadeSubWindows) self.actNext = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.actPrevious = QAction( "Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.actSeparator = QAction(self) self.actSeparator.setSeparator(True) self.actAbout = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) def createMenus(self): """Populate File, Edit, Window and Help with `QAction`""" super().createMenus() self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.actAbout) # Any time the edit menu is about to be shown, update it self.editMenu.aboutToShow.connect(self.updateEditMenu) def onWindowNodesToolbar(self): """Event handling the visibility of the `Nodes Dock`""" if self.nodesDock.isVisible(): self.nodesDock.hide() else: self.nodesDock.show() def createToolBars(self): pass def createNodesDock(self): """Create `Nodes Dock` and populates it with the list of `Nodes` The `Nodes` are automatically detected via the :class:~`examples.calc_drag_listbox.QNEDragListBox` """ self.nodeListWidget = QNEDragListbox() self.nodesDock = QDockWidget("Nodes") self.nodesDock.setWidget(self.nodeListWidget) self.nodesDock.setFloating(False) self.addDockWidget(Qt.RightDockWidgetArea, self.nodesDock) def createStatusBar(self): self.statusBar().showMessage("Ready", ) def updateMenus(self): active = self.getCurrentNodeEditorWidget() hasMdiChild = (active is not None) self.actSave.setEnabled(hasMdiChild) self.actSaveAs.setEnabled(hasMdiChild) self.actClose.setEnabled(hasMdiChild) self.actCloseAll.setEnabled(hasMdiChild) self.actTile.setEnabled(hasMdiChild) self.actCascade.setEnabled(hasMdiChild) self.actNext.setEnabled(hasMdiChild) self.actPrevious.setEnabled(hasMdiChild) self.actSeparator.setVisible(hasMdiChild) self.updateEditMenu() def updateEditMenu(self): if DEBUG: print('updateEditMenu') try: active = self.getCurrentNodeEditorWidget() hasMdiChild = (active is not None) hasSelectedItems = hasMdiChild and active.hasSelectedItems() self.actPaste.setEnabled(hasMdiChild) self.actCut.setEnabled(hasSelectedItems) self.actCopy.setEnabled(hasSelectedItems) self.actDelete.setEnabled(hasSelectedItems) self.actUndo.setEnabled(hasMdiChild and active.canUndo()) self.actRedo.setEnabled(hasMdiChild and active.canRedo()) except Exception as e: dumpException(e) def updateWindowMenu(self): self.windowMenu.clear() toolbar_nodes = self.windowMenu.addAction('Nodes toolbar') toolbar_nodes.setCheckable(True) toolbar_nodes.triggered.connect(self.onWindowNodesToolbar) toolbar_nodes.setChecked(self.nodesDock.isVisible()) self.windowMenu.addSeparator() self.windowMenu.addAction(self.actClose) self.windowMenu.addAction(self.actCloseAll) self.windowMenu.addSeparator() self.windowMenu.addAction(self.actTile) self.windowMenu.addAction(self.actCascade) self.windowMenu.addSeparator() self.windowMenu.addAction(self.actNext) self.windowMenu.addAction(self.actPrevious) self.windowMenu.addAction(self.actSeparator) windows = self.mdiArea.subWindowList() self.actSeparator.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.getUserFriendlyFilename()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.getCurrentNodeEditorWidget()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def getCurrentNodeEditorWidget(self) -> NodeEditorWidget: """Return the widget currently holding the scene. For different application, the method can be overridden to return mdiArea, the central widget... Returns ------- NodeEditorWidget Node editor Widget. The widget holding the scene. """ activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() return None def onFileNew(self): try: subwnd = self.createMdiChild() subwnd.widget().fileNew() subwnd.show() except Exception as e: dumpException(e) def onFileOpen(self): """Open OpenFileDialog""" # OpenFile dialog fnames, filter = QFileDialog.getOpenFileNames( self, 'Open graph from file', self.getFileDialogDirectory(), self.getFileDialogFilter()) try: for fname in fnames: if fname: existing = self.findMdiChild(fname) if existing: self.mdiArea.setActiveSubWindow(existing) else: # do not use createMdiChild as a new node editor to call the fileLoad method # Create new subwindow and open file nodeeditor = CalculatorSubWindow() if nodeeditor.fileLoad(fname): self.statusBar().showMessage( f'File {fname} loaded', 5000) nodeeditor.setTitle() subwnd = self.createMdiChild(nodeeditor) subwnd.show() else: nodeeditor.close() except Exception as e: dumpException(e) def about(self): QMessageBox.about( self, "About Calculator NodeEditor Example", "The <b>Calculator NodeEditor</b> example demonstrates how to write multiple " "document interface applications using PyQt5 and NodeEditor.") def closeEvent(self, event: QCloseEvent) -> None: try: self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: self.writeSettings() event.accept() # In case of fixing the application closing # import sys # sys.exit(0) except Exception as e: dumpException(e) def createMdiChild(self, child_widget=None): nodeeditor = child_widget if child_widget is not None else CalculatorSubWindow( ) subwnd = self.mdiArea.addSubWindow(nodeeditor, ) subwnd.setWindowIcon(self.empty_icon) # nodeeditor.scene.addItemSelectedListener(self.updateEditMenu) # nodeeditor.scene.addItemsDeselectedListener(self.updateEditMenu) nodeeditor.scene.history.addHistoryModifiedListener( self.updateEditMenu) nodeeditor.addCloseEventListener(self.onSubWndClose) return subwnd def onSubWndClose(self, widget: CalculatorSubWindow, event: QCloseEvent): # close event from the nodeeditor works by asking the active widget # if modification occurs on the active widget, ask to save or not. # Therefore when closing a subwindow, select the corresponding subwindow existing = self.findMdiChild(widget.filename) self.mdiArea.setActiveSubWindow(existing) # Does the active widget need to be saved ? if self.maybeSave(): event.accept() else: event.ignore() def findMdiChild(self, fileName): for window in self.mdiArea.subWindowList(): if window.widget().filename == fileName: return window return None def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window)
class RDFNavigator(QMainWindow): output_message = pyqtSignal(str) def __init__(self): super(RDFNavigator, self).__init__() self.lastDir = '.' self.settingsManager = RDFNavigatorSettignsManager() self.resourceRefManager = RDFNavigatorResourceReferenceManager() self.childrenFactory = RDFNavigatorChildrenFactory(self) self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.updateMenus() self.createDockWidgets() self.readSettings() self.setWindowTitle("RDF Navigator") self.global_data = {} self.analyzeSystemData() #self.setStyleSheet("""QToolTip { background-color: black; color: white; border: black solid 1px }""") def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: self.writeSettings() event.accept() def newFile(self, fileType): child = self.createMdiChild(fileType) child.newFile() child.show() def openFileHelper(self, fileName, fileType): if fileName: self.lastDir = os.path.dirname(fileName) existing = self.findMdiChild(fileName) if existing: self.mdiArea.setActiveSubWindow(existing) return child = self.createMdiChild(fileType) child.setManager(self.settingsManager) if child.loadFile(fileName): self.statusBar().showMessage("File loaded", 2000) child.show() else: child.close() def open(self): fileName, _ = QFileDialog.getOpenFileName( self, "Open runntime data format file", self.lastDir, "RDF Files (*.RDF);;XML Files (*.xml)") self.openFileHelper(fileName, RDFNavigatorChildrenTypes.XML) def openProject(self): fileName, _ = QFileDialog.getOpenFileName( self, "Open XML schema project file", self.lastDir, "XML Schema Files (*.xsd);;") self.openFileHelper(fileName, RDFNavigatorChildrenTypes.SCHEMA) child = self.findMdiChild(fileName) if child: schema = RDFNavigatorXmlSchema() schema.validation_message.connect(self.output_message) schema.setSchemaPath(fileName) graph = schema.getSchemaDependencyGraph() self.projectStructureWidget.createProjectTree( fileName, graph, RDFNavigatorChildrenTypes.SCHEMA) self.projectStructureWidget.open_file_request.connect( self.openFileHelper) def openTemplate(self): fileName, _ = QFileDialog.getOpenFileName( self, "Open system data template file", self.lastDir, "XML Template Files (*.xml);;") self.openFileHelper(fileName, RDFNavigatorChildrenTypes.TEMPLATE) child = self.findMdiChild(fileName) if child: schema = RDFNavigatorXmlSchema() schema.validation_message.connect(self.output_message) schema.setSchemaPath(fileName) graph = schema.getTemplateDependencyGraph() self.projectStructureWidget.createProjectTree( fileName, graph, RDFNavigatorChildrenTypes.TEMPLATE) self.projectStructureWidget.createObjectsTree(fileName) self.projectStructureWidget.createFileSystemTree(fileName) self.projectStructureWidget.open_file_request.connect( self.openFileHelper) self.analyzeTemplateData(os.path.dirname(fileName)) def save(self): if self.activeMdiChild() and self.activeMdiChild().save(): self.statusBar().showMessage("File saved", 2000) def saveAs(self): if self.activeMdiChild() and self.activeMdiChild().saveAs(): self.statusBar().showMessage("File saved", 2000) def cut(self): if self.activeMdiChild(): self.activeMdiChild().cut() def copy(self): if self.activeMdiChild(): self.activeMdiChild().copy() def paste(self): if self.activeMdiChild(): self.activeMdiChild().paste() def activateFind(self): child = self.activeMdiChild() find = RDFNavigatorFind(self) find.findAllCurrentClicked.connect(child.findAll) find.findNextClicked.connect(child.findNextWord) find.findCountClicked.connect(child.countWord) if child.hasSelectedText(): text = child.selectedText() find.setFindText(text) find.show() def about(self): QMessageBox.about(self, "About RDF Navigator", "Tool to simplify work with RDF data") def updateMenus(self): hasMdiChild = (self.activeMdiChild() is not None) self.saveAct.setEnabled(hasMdiChild) self.saveAsAct.setEnabled(hasMdiChild) self.pasteAct.setEnabled(hasMdiChild) self.closeAct.setEnabled(hasMdiChild) self.closeAllAct.setEnabled(hasMdiChild) self.tileAct.setEnabled(hasMdiChild) self.cascadeAct.setEnabled(hasMdiChild) self.nextAct.setEnabled(hasMdiChild) self.previousAct.setEnabled(hasMdiChild) self.separatorAct.setVisible(hasMdiChild) hasSelection = (self.activeMdiChild() is not None and self.activeMdiChild().hasSelectedText()) self.cutAct.setEnabled(hasSelection) self.copyAct.setEnabled(hasSelection) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tileAct) self.windowMenu.addAction(self.cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.activeMdiChild()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def createMdiChild(self, childType): child = self.childrenFactory.createObject(childType) self.mdiArea.addSubWindow(child) child.copyAvailable.connect(self.cutAct.setEnabled) child.copyAvailable.connect(self.copyAct.setEnabled) return child def createActions(self): self.newAct = QAction(QIcon(':/images/new.png'), "&New", self, shortcut=QKeySequence.New, statusTip="Create a new file", triggered=self.newFile) self.openFileAct = QAction(QIcon(':/images/open.png'), "&Open file...", self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.open) self.openProjectAct = QAction(QIcon(':/images/openProject.png'), "&Open project...", self, shortcut=QKeySequence("Ctrl+Shift+O"), statusTip="Open an existing project", triggered=self.openProject) self.openTemplate = QAction(QIcon(':/images/sdt.png'), "&Open template...", self, shortcut=QKeySequence("Alt+Shift+O"), statusTip="Open an existing template", triggered=self.openTemplate) self.saveAct = QAction(QIcon(':/images/save.png'), "&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk", triggered=self.save) self.saveAsAct = QAction( "Save &As...", self, shortcut=QKeySequence.SaveAs, statusTip="Save the document under a new name", triggered=self.saveAs) self.exitAct = QAction( "E&xit", self, shortcut=QKeySequence.Quit, statusTip="Exit the application", triggered=QApplication.instance().closeAllWindows) self.cutAct = QAction( QIcon(':/images/cut.png'), "Cu&t", self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection's contents to the clipboard", triggered=self.cut) self.copyAct = QAction( QIcon(':/images/copy.png'), "&Copy", self, shortcut=QKeySequence.Copy, statusTip="Copy the current selection's contents to the clipboard", triggered=self.copy) self.pasteAct = QAction( QIcon(':/images/paste.png'), "&Paste", self, shortcut=QKeySequence.Paste, statusTip= "Paste the clipboard's contents into the current selection", triggered=self.paste) self.findAct = QAction(QIcon(':/images/find.png'), "&Find", self, shortcut=QKeySequence.Find, statusTip="Find text", triggered=self.activateFind) self.settingsAct = QAction(QIcon(':/images/settings.png'), "Open settings", self, shortcut=QKeySequence("Ctrl+1"), statusTip="Open Settings", triggered=self.activateSettings) self.showProjectStructAct = QAction( QIcon(':/images/project_structure.png'), "Show structure", self, shortcut=QKeySequence("Alt+1"), statusTip="Show project structure", triggered=self.showProjectStructure) self.showOutputAct = QAction(QIcon(':/images/project_output.png'), "Show output", self, shortcut=QKeySequence("Alt+2"), statusTip="Show output", triggered=self.showOutput) self.showBookmarks = QAction(QIcon(':/images/project_bookmarks.png'), "Show bookmarks", self, shortcut=QKeySequence("Alt+3"), statusTip="Show bookmarks", triggered=self.showBookmarks) self.showAsDiagram = QAction(QIcon(':/images/diagram.png'), "Show as diagram", self, shortcut=QKeySequence("Alt+4"), statusTip="Show document as diagram", triggered=self.showAsDiagram) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.tileAct = QAction("&Tile", self, statusTip="Tile the windows", triggered=self.mdiArea.tileSubWindows) self.cascadeAct = QAction("&Cascade", self, statusTip="Cascade the windows", triggered=self.mdiArea.cascadeSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction( "Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) self.aboutAct = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, statusTip="Show the Qt library's About box", triggered=QApplication.instance().aboutQt) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.openFileAct) self.fileMenu.addAction(self.openProjectAct) self.fileMenu.addAction(self.openTemplate) self.fileMenu.addAction(self.saveAct) self.fileMenu.addAction(self.saveAsAct) self.fileMenu.addSeparator() action = self.fileMenu.addAction("Switch layout direction") action.triggered.connect(self.switchLayoutDirection) self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.editMenu.addAction(self.findAct) self.settingsMenu = self.menuBar().addMenu("Set&tings") self.settingsMenu.addAction(self.settingsAct) self.viewMenu = self.menuBar().addMenu("&View") self.createViewMenu() self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.fileToolBar = self.addToolBar("File") self.fileToolBar.addAction(self.newAct) self.fileToolBar.addAction(self.openFileAct) self.fileToolBar.addAction(self.openProjectAct) self.fileToolBar.addAction(self.openTemplate) self.fileToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar("Edit") self.editToolBar.addAction(self.cutAct) self.editToolBar.addAction(self.copyAct) self.editToolBar.addAction(self.pasteAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def createDockWidgets(self): self.projectStructureWidget = RDFNavigatorProjectStructure(self) self.projectStructureDockWidget = QDockWidget("Project structure", self) self.projectStructureDockWidget.setWidget(self.projectStructureWidget) self.addDockWidget(Qt.LeftDockWidgetArea, self.projectStructureDockWidget) self.projectOutputWidget = RDFNavigatorOutput(self) self.projectOutputDockWidget = QDockWidget("Project output", self) self.projectOutputDockWidget.setWidget(self.projectOutputWidget) self.addDockWidget(Qt.BottomDockWidgetArea, self.projectOutputDockWidget) self.output_message.connect(self.projectOutputWidget.write) self.bookmarskWidget = RDFNavigatorBookmarks(self) self.bookmarksDockWidget = QDockWidget("Bookmarks", self) self.bookmarksDockWidget.setWidget(self.bookmarskWidget) self.addDockWidget(Qt.BottomDockWidgetArea, self.bookmarksDockWidget) self.bookmarskWidget.bookmark_ref_requested.connect(self.showBookmark) def readSettings(self): pos = self.settingsManager.getConfig('pos', QPoint(200, 200)) size = self.settingsManager.getConfig('size', QSize(400, 400)) self.lastDir = self.settingsManager.getConfig('lastDir', '') self.move(pos) self.resize(size) def writeSettings(self): self.settingsManager.setConfig('pos', self.pos()) self.settingsManager.setConfig('size', self.size()) self.settingsManager.setConfig('lastDir', self.lastDir) def activeMdiChild(self): activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() return None def findMdiChild(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def switchLayoutDirection(self): if self.layoutDirection() == Qt.LeftToRight: QApplication.setLayoutDirection(Qt.RightToLeft) else: QApplication.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window) def activateSettings(self): settingsDlg = RDFNavigatorSettings(self) settingsDlg.setPluginsPath(self.settingsManager) settingsDlg.setRDFToolsPath(self.settingsManager) settingsDlg.setSchemaPath(self.settingsManager) settingsDlg.setSysDataPath(self.settingsManager) settingsDlg.exec_() settingsDict = settingsDlg.getConfig() map(lambda (x, y): self.settingsManager.setConfig(x, y), settingsDict.items()) def analyzeSystemData(self): self.resourceRefManager.setSysDataPath( self.settingsManager.getConfig('sys_data', '')) self.global_refs_data, self.global_vals_data = self.resourceRefManager.analyzeRefs( ) if self.global_refs_data != {} and self.global_vals_data != {}: self.global_file_refs_data = dict( reduce(lambda x, y: x + y, [[(v, keys) for v in vals] for keys, vals in self.global_refs_data.iteritems() if vals != {}])) def analyzeTemplateData(self, template_path): sysDataPath = self.resourceRefManager.getSysDataPath() self.resourceRefManager.setSysDataPath(template_path) self.template_refs_data, self.template_vals_data = self.resourceRefManager.analyzeRefs( ) if self.template_refs_data != {} and self.template_vals_data != {}: self.template_file_refs_data = dict( reduce(lambda x, y: x + y, [[(v, keys) for v in vals] for keys, vals in self.template_refs_data.iteritems() if vals != {}])) self.resourceRefManager.setSysDataPath(sysDataPath) def showReference(self, obj_name, key_id): child_name = self.template_file_refs_data.get(obj_name) if child_name is None: child_name = self.global_file_refs_data[obj_name] child = self.findMdiChild(child_name) if child is None: self.openFileHelper(child_name, RDFNavigatorChildrenTypes.TEMPLATE) child = self.findMdiChild(child_name) self.mdiArea.setActiveSubWindow(child) line = None try: line = self.template_refs_data[child_name][obj_name][key_id] except KeyError: line = self.global_refs_data[child_name][obj_name][key_id] child.widget().goToLine(line) def showReferenceValue(self, obj_name, key_id): child_name = self.template_file_refs_data.get(obj_name) if child_name is None: child_name = self.global_file_refs_data[obj_name] value = None try: value = self.template_vals_data[child_name][obj_name][key_id] except KeyError: value = self.global_refs_data[child_name][obj_name][key_id] child = self.activeMdiChild() if child is not None: child.displayRefValue(value) def showBookmark(self, filename, line): child = self.findMdiChild(filename) if child is None: self.openFileHelper(filename, RDFNavigatorChildrenTypes.TEMPLATE) child = self.findMdiChild(filename) self.mdiArea.setActiveSubWindow(child) child.widget().goToLine(line) def createViewMenu(self): self.viewMenu.addAction(self.showProjectStructAct) self.viewMenu.addAction(self.showOutputAct) self.viewMenu.addAction(self.showBookmarks) self.viewMenu.addAction(self.showAsDiagram) def showProjectStructure(self): self.projectStructureDockWidget.show() def showOutput(self): self.projectOutputDockWidget.show() def showBookmarks(self): self.bookmarksDockWidget.show() def showAsDiagram(self): from rdfdiagram.rdfdiagramwidget import RdfDiagramWidget rdfdiagram = RdfDiagramWidget(self) self.mdiArea.addSubWindow(rdfdiagram) rdfdiagram.show()
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.updateMenus() self.readSettings() self.setWindowTitle("MDI") def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: self.writeSettings() event.accept() def newFile(self): child = self.createMdiChild() child.newFile() child.show() def open(self): fileName, _ = QFileDialog.getOpenFileName(self) if fileName: existing = self.findMdiChild(fileName) if existing: self.mdiArea.setActiveSubWindow(existing) return child = self.createMdiChild() if child.loadFile(fileName): self.statusBar().showMessage("File loaded", 2000) child.show() else: child.close() def save(self): if self.activeMdiChild() and self.activeMdiChild().save(): self.statusBar().showMessage("File saved", 2000) def saveAs(self): if self.activeMdiChild() and self.activeMdiChild().saveAs(): self.statusBar().showMessage("File saved", 2000) def cut(self): if self.activeMdiChild(): self.activeMdiChild().cut() def copy(self): if self.activeMdiChild(): self.activeMdiChild().copy() def paste(self): if self.activeMdiChild(): self.activeMdiChild().paste() def about(self): QMessageBox.about(self, "About MDI", "The <b>MDI</b> example demonstrates how to write multiple " "document interface applications using Qt.") def updateMenus(self): hasMdiChild = (self.activeMdiChild() is not None) self.saveAct.setEnabled(hasMdiChild) self.saveAsAct.setEnabled(hasMdiChild) self.pasteAct.setEnabled(hasMdiChild) self.closeAct.setEnabled(hasMdiChild) self.closeAllAct.setEnabled(hasMdiChild) self.tileAct.setEnabled(hasMdiChild) self.cascadeAct.setEnabled(hasMdiChild) self.nextAct.setEnabled(hasMdiChild) self.previousAct.setEnabled(hasMdiChild) self.separatorAct.setVisible(hasMdiChild) hasSelection = (self.activeMdiChild() is not None and self.activeMdiChild().textCursor().hasSelection()) self.cutAct.setEnabled(hasSelection) self.copyAct.setEnabled(hasSelection) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tileAct) self.windowMenu.addAction(self.cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.activeMdiChild()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def createMdiChild(self): child = MdiChild() self.mdiArea.addSubWindow(child) child.copyAvailable.connect(self.cutAct.setEnabled) child.copyAvailable.connect(self.copyAct.setEnabled) return child def createActions(self): self.newAct = QAction(QIcon(':/images/new.png'), "&New", self, shortcut=QKeySequence.New, statusTip="Create a new file", triggered=self.newFile) self.openAct = QAction(QIcon(':/images/open.png'), "&Open...", self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.open) self.saveAct = QAction(QIcon(':/images/save.png'), "&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk", triggered=self.save) self.saveAsAct = QAction("Save &As...", self, shortcut=QKeySequence.SaveAs, statusTip="Save the document under a new name", triggered=self.saveAs) self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit, statusTip="Exit the application", triggered=QApplication.instance().closeAllWindows) self.cutAct = QAction(QIcon(':/images/cut.png'), "Cu&t", self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection's contents to the clipboard", triggered=self.cut) self.copyAct = QAction(QIcon(':/images/copy.png'), "&Copy", self, shortcut=QKeySequence.Copy, statusTip="Copy the current selection's contents to the clipboard", triggered=self.copy) self.pasteAct = QAction(QIcon(':/images/paste.png'), "&Paste", self, shortcut=QKeySequence.Paste, statusTip="Paste the clipboard's contents into the current selection", triggered=self.paste) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.tileAct = QAction("&Tile", self, statusTip="Tile the windows", triggered=self.mdiArea.tileSubWindows) self.cascadeAct = QAction("&Cascade", self, statusTip="Cascade the windows", triggered=self.mdiArea.cascadeSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction("Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) self.aboutAct = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, statusTip="Show the Qt library's About box", triggered=QApplication.instance().aboutQt) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.saveAct) self.fileMenu.addAction(self.saveAsAct) self.fileMenu.addSeparator() action = self.fileMenu.addAction("Switch layout direction") action.triggered.connect(self.switchLayoutDirection) self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.fileToolBar = self.addToolBar("File") self.fileToolBar.addAction(self.newAct) self.fileToolBar.addAction(self.openAct) self.fileToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar("Edit") self.editToolBar.addAction(self.cutAct) self.editToolBar.addAction(self.copyAct) self.editToolBar.addAction(self.pasteAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def readSettings(self): settings = QSettings('Trolltech', 'MDI Example') pos = settings.value('pos', QPoint(200, 200)) size = settings.value('size', QSize(400, 400)) self.move(pos) self.resize(size) def writeSettings(self): settings = QSettings('Trolltech', 'MDI Example') settings.setValue('pos', self.pos()) settings.setValue('size', self.size()) def activeMdiChild(self): activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() return None def findMdiChild(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def switchLayoutDirection(self): if self.layoutDirection() == Qt.LeftToRight: QApplication.setLayoutDirection(Qt.RightToLeft) else: QApplication.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window)
class CQCadWindow(QMainWindow): # Platform independent application settings settings = QSettings('cqcad', 'settings') guiState = QSettings('cqcad', 'gui') menuList = [] def __init__(self): super(CQCadWindow, self).__init__() self.initUI() def closeEvent(self, event): """ Allows us to clean up after ourselves and make sure that everything is saved that the user intended to save. :param event: Object describing this event :return: None """ self.guiState.sync() self.settings.sync() def clickAbout(self): """ Displays a dialog with information about this application, including the version information for all libraries. :return: None """ varTitle = QtCore.QCoreApplication.translate('cqcad', "About CQCad") varMsg = QtCore.QCoreApplication.translate( 'cqcad', "CQCad 2D/3D CAD\r\nVersion: " + __version__ + "\r\n\r\nCadQuery Version: N/A\r\nPythonOCC Version: N/A\r\nFreeCAD Version: N/A" ) QMessageBox.about(self, varTitle, varMsg) def clickHelp(self): """ Displays a dialog with information about where to find help. :return: None """ docLabel = QLabel("http://dcowden.github.io/cadquery/") docLabel.setOpenExternalLinks = True varTitle = QtCore.QCoreApplication.translate('cqcad', "Finding Help") varMsg = QtCore.QCoreApplication.translate( 'cqcad', "CQCad 2D/3D CAD\r\nVersion: " + __version__ + "\r\n\r\nDocumentation: http://dcowden.github.io/cadquery/\r\nVideo Tutorials: https://www.youtube.com/playlist?list=PLMXw3KF1-YfUeFnw6Ich9jvgYjyjiBS3w\r\nUser Group: https://groups.google.com/forum/#!forum/cadquery" ) msgBox = QMessageBox.about(self, varTitle, varMsg) # msgBox.setTextFormat(Qt.RichText) def notImplemented(self): """ Displays a dialog with information about this application, including the version information for all libraries. :return: None """ niTitle = "Not Implemented" niMsg = QtCore.QCoreApplication.translate( 'cqcad', "This feature has not been implemented yet. If you would like to see this feature in the release version, please create an issue on the GitHub repository. https://github.com/jmwright/cqcad" ) QMessageBox.about(self, niTitle, niMsg) def switchModes(self): """ Toggles the other mode check menu items so that only one mode is active at a time. :return: None """ sending_button = self.sender() # Toggle all the other items that were not selected if sending_button.objectName() == 'mouse_first': self.script1stAct.setChecked(False) # Keep track of the state of the GUI for the user self.guiState.setValue('mouse_first_enabled', True) self.guiState.setValue('script_first_enabled', False) elif sending_button.objectName() == 'script_first': self.mouse1stAct.setChecked(False) # Keep track of the state of the GUI for the user self.guiState.setValue('mouse_first_enabled', False) self.guiState.setValue('script_first_enabled', True) def toggleDock(self): """ Toggles the dock widgets visibility when the menu item is clicked. :return: None """ if self.dock.isVisible() == True: self.dock.hide() self.dockAct.setChecked(False) # Keep track of the state of the GUI for the user self.guiState.setValue('dock_visible', False) else: self.dock.show() self.dockAct.setChecked(True) # Keep track of the state of the GUI for the user self.guiState.setValue('dock_visible', True) self.guiState.sync() def uncheckDockMenu(self): """ Unchecks the dock menu item if the dock widget is closed manually. :return: None """ self.dockAct.setChecked(False) # Keep track of the state of the GUI for the user self.guiState.setValue('dock_visible', False) def setInitialDockState(self): dockState = self.guiState.value('dock_visible', type=bool) if dockState: self.dock.show() self.dockAct.setChecked(True) else: self.dock.hide() self.dockAct.setChecked(False) def getLayouts(self): """ Finds a list of all the layouts that are installed. :return: The titles of all the layouts that are installed. """ module_base_path = os.path.dirname(__file__) layouts_path = os.path.join(module_base_path, 'layouts') titles = [] functions = {} for module in os.listdir(layouts_path): if module.endswith('.py') and module != "__init__.py": baseName = os.path.splitext(module)[0] name = "layouts." + baseName mod = __import__(name, fromlist=[baseName]) titles.append(mod.__title__) functions[mod.__title__.replace(' ', '_').lower()] = mod.execute return (titles, functions) def loadExtensions(self): """ Finds all of the extensions that are installed and instantiates them. :return: None """ module_base_path = os.path.dirname(__file__) layouts_path = os.path.join(module_base_path, 'extensions') # Load all the extensions and for now tell them to run their setup function to make changes to the GUI for module in os.listdir(layouts_path): if module.endswith('.py') and module != "__init__.py": baseName = os.path.splitext(module)[0] name = "extensions." + baseName mod = __import__(name, fromlist=[baseName]) enabled = self.guiState.value(name + "_checked", type=bool) # Only load the controls for the extension if it is selected if enabled: mod.setup(self) act = QAction('&' + baseName, self, checkable=True) # act.setShortcut('F6') act.setStatusTip(baseName) act.setChecked(enabled) act.setObjectName(baseName) act.triggered.connect(self.toggleExtension) self.extsMenu.addAction(act) self.menuList.append(act) def fireFunction(self): """ Allows us to fire dynamically loaded functions while avoiding a mess with a collections.namedtuple import error. :return: None """ widget = self.sender().objectName() # Avoid an exception from the key not being present if widget in self.funcs.keys(): self.funcs[widget](self.mdiArea) def toggleExtsMenuVisibility(self): """ Allows the user to click on the extensions toolbutton and still get the drop-down menu. :return: None """ if not self.extsMenu.isVisible(): self.extsButton.showMenu() def toggleExtension(self): baseName = self.sender().objectName() name = "extensions." + baseName mod = __import__(name, fromlist=[baseName]) if self.sender().isChecked(): mod.setup(self) self.guiState.setValue(name + "_checked", True) else: mod.tearDown(self) self.guiState.setValue(name + "_checked", False) self.guiState.sync() def showSettingsDialog(self): self.settingsDlg = SettingsDialog(self) # TODO: Init with keybindings, execute_on_save, use_external_editor, max_line_length settings, line_numbers, cad_engine def showNewDialog(self): newDlg = NewDialog(self) def addScriptWindow(self): """ Opens a template in the Python script editor :return: None """ subWin = QMdiSubWindow() child = CodeEditor(self) subWin.setWidget(child) child.setObjectName('script:' + str(uuid.uuid1())) self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg')) self.mdiArea.addSubWindow(subWin) subWin.setWindowState(QtCore.Qt.WindowMaximized) subWin.setWindowTitle('untitled.py') file = open("templates/script_template.py", "r") templateText = file.read() child.setPlainText(templateText) def addPartWindow(self): """ For now, default to opening a part template in the Python script editor :return: None """ subWin = QMdiSubWindow() self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg')) self.mdiArea.addSubWindow(subWin) # backend_str = "qt-pyqt5" # used_backend = load_backend(backend_str) # from OCC.Display.qtDisplay import qtViewer3d # Set the part window up differently based on whether the user has # selected the mouse first or script first mode if self.mouse1stAct.isChecked(): child = Viewer3D(self) subWin.setWidget(child) # If we don't do this the window title bar can disappear subWin.setMinimumSize(100, 300) subWin.setWindowState(QtCore.Qt.WindowMaximized) # For now display a default object child.InitDriver() child._display.Test() else: child = CodeEditor(self) subWin.setWidget(child) file = open("templates/part_template.py", "r") templateText = file.read() child.setPlainText(templateText) subWin.setWindowState(QtCore.Qt.WindowMaximized) def addAsmWindow(self): """ For now, default to opening a part template in the Python script editor :return: None """ # For now, default to opening a script editor child = CodeEditor(self) self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg')) self.mdiArea.addSubWindow(child) child.setWindowState(QtCore.Qt.WindowMaximized) file = open("templates/assembly_template.py", "r") templateText = file.read() child.setPlainText(templateText) def executeScript(self): """ Executes the script in the active editor window and displays it. """ # Get the active window so we can get the script and match the title activeWin = self.mdiArea.activeSubWindow() scriptTitle = activeWin.windowTitle() # If this isn't a script window we need to handle it differently if ".py" not in scriptTitle: self.statusBar().showMessage( 'Cannot Execute From a Non-Script Window') return # See if the 3D view is somewhere in the MDI subwindows subWin = self.getSubwindowByName(scriptTitle + " (3D)") # If the 3D view doesn't exist, create it if subWin == None: # Set up a new 3D view window subWin = QMdiSubWindow() # self.mdiArea.setWindowIcon(QIcon('content/images/python_logo.svg')) self.mdiArea.addSubWindow(subWin) child = Viewer3D(self) subWin.setWidget(child) subWin.setWindowTitle(scriptTitle + " (3D)") # If we don't do this the window title bar can disappear subWin.setMinimumSize(100, 300) subWin.setWindowState(QtCore.Qt.WindowMaximized) # For now display a default object child.InitDriver() child._display.Test() # Extract the text from the script window, execute it, and display the result scriptText = activeWin.widget().toPlainText() print(scriptText) def getSubwindowByName(self, name): """ Searches for a subwindow in the MDI area by name """ foundWin = None for subwin in self.mdiArea.subWindowList(): if subwin.windowTitle() == name: foundWin = subwin return foundWin def setInitialGUIState(self): # Mouse vs script mode self.guiState.setValue('script_first_enabled', True) self.guiState.setValue('mouse_first_enabled', False) # Widget visibility self.guiState.setValue('dock_visible', True) # Make sure we only enter this code once self.guiState.setValue('first_run_over', True) def initUI(self): # Handle setting things up if this is the first time this app has been run if not self.guiState.value('first_run_over', type=bool): self.setInitialGUIState() # Translations of menu items exitName = QtCore.QCoreApplication.translate('cqcad', "Exit") exitTip = QtCore.QCoreApplication.translate('cqcad', "Exit application") newName = QtCore.QCoreApplication.translate('cqcad', "New") newTip = QtCore.QCoreApplication.translate('cqcad', "New") openName = QtCore.QCoreApplication.translate('cqcad', "Open") openTip = QtCore.QCoreApplication.translate('cqcad', "Open project or script") closeName = QtCore.QCoreApplication.translate('cqcad', "Close") closeTip = QtCore.QCoreApplication.translate( 'cqcad', "Close project or script") impName = QtCore.QCoreApplication.translate('cqcad', "Import") impTip = QtCore.QCoreApplication.translate('cqcad', "Import") expName = QtCore.QCoreApplication.translate('cqcad', "Export") expTip = QtCore.QCoreApplication.translate('cqcad', "Export") abtName = QtCore.QCoreApplication.translate('cqcad', "About") abtTip = QtCore.QCoreApplication.translate('cqcad', "About") m1stName = QtCore.QCoreApplication.translate( 'cqcad', "Mouse First (Experimental)") m1stTip = QtCore.QCoreApplication.translate( 'cqcad', "Mouse first (experimental)") s1stName = QtCore.QCoreApplication.translate('cqcad', "Script First") s1stTip = QtCore.QCoreApplication.translate('cqcad', "Script first") pEdName = QtCore.QCoreApplication.translate('cqcad', "Parameters Editor") pEdTip = QtCore.QCoreApplication.translate('cqcad', "Parameters editor") viewerName = QtCore.QCoreApplication.translate('cqcad', "Object Viewer") viewerTip = QtCore.QCoreApplication.translate('cqcad', "Object viewer") conName = QtCore.QCoreApplication.translate('cqcad', "Console") conTip = QtCore.QCoreApplication.translate('cqcad', "Console") dockName = QtCore.QCoreApplication.translate('cqcad', "Dock") libsName = QtCore.QCoreApplication.translate('cqcad', "Collections") libsTip = QtCore.QCoreApplication.translate('cqcad', "Collections") extsName = QtCore.QCoreApplication.translate('cqcad', "Extensions") extsTip = QtCore.QCoreApplication.translate('cqcad', "Extensions") layoutsName = QtCore.QCoreApplication.translate('cqcad', "Layouts") layoutsTip = QtCore.QCoreApplication.translate('cqcad', "Layouts") setsName = QtCore.QCoreApplication.translate('cqcad', "Settings") setsTip = QtCore.QCoreApplication.translate('cqcad', "Settings") fileName = QtCore.QCoreApplication.translate('cqcad', "File") rcntName = QtCore.QCoreApplication.translate('cqcad', "Recent") exName = QtCore.QCoreApplication.translate('cqcad', "Examples") editName = QtCore.QCoreApplication.translate('cqcad', "Edit") viewName = QtCore.QCoreApplication.translate('cqcad', "View") modesName = QtCore.QCoreApplication.translate('cqcad', "Modes") panelsName = QtCore.QCoreApplication.translate('cqcad', "Panels") layoutMenuName = QtCore.QCoreApplication.translate('cqcad', "Layout") layoutMenuTip = QtCore.QCoreApplication.translate('cqcad', "Layout") helpName = QtCore.QCoreApplication.translate('cqcad', "Help") axioViewName = QtCore.QCoreApplication.translate( 'cqcad', "Axiometric View") axioViewTip = QtCore.QCoreApplication.translate( 'cqcad', "Axiometric View") frontViewName = QtCore.QCoreApplication.translate( 'cqcad', "Front View") frontViewTip = QtCore.QCoreApplication.translate('cqcad', "Front View") backViewName = QtCore.QCoreApplication.translate('cqcad', "Back View") backViewTip = QtCore.QCoreApplication.translate('cqcad', "Back View") topViewName = QtCore.QCoreApplication.translate('cqcad', "Top View") topViewTip = QtCore.QCoreApplication.translate('cqcad', "Top View") bottomViewName = QtCore.QCoreApplication.translate( 'cqcad', "Bottom View") bottomViewTip = QtCore.QCoreApplication.translate( 'cqcad', "Bottom View") leftViewName = QtCore.QCoreApplication.translate('cqcad', "Left View") leftViewTip = QtCore.QCoreApplication.translate('cqcad', "Left View") rightViewName = QtCore.QCoreApplication.translate( 'cqcad', "Right View") rightViewTip = QtCore.QCoreApplication.translate('cqcad', "Right View") fitAllName = QtCore.QCoreApplication.translate('cqcad', "Fit All") fitAllTip = QtCore.QCoreApplication.translate('cqcad', "Fit All") docsName = QtCore.QCoreApplication.translate('cqcad', "Documentation") docsTip = QtCore.QCoreApplication.translate('cqcad', "Documentation") vidsName = QtCore.QCoreApplication.translate('cqcad', "Video Tutorials") vidsTip = QtCore.QCoreApplication.translate('cqcad', "Video Tutorials") uGroupName = QtCore.QCoreApplication.translate('cqcad', "User Group") uGroupTip = QtCore.QCoreApplication.translate('cqcad', "User Group") extsToolName = QtCore.QCoreApplication.translate('cqcad', "Extensions") extsToolTip = QtCore.QCoreApplication.translate('cqcad', "Extensions") #self.setGeometry(300, 300, 250, 150) # The central MDI window area self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.setWindowTitle('CQCad') self.setWindowIcon( QtGui.QIcon('content/images/cadquery_logo_dark.svg')) self.statusBar().showMessage('Ready') # Set up our menu exitAct = QAction( QIcon('content/images/Material/ic_exit_to_app_24px.svg'), '&' + exitName, self) exitAct.setShortcut('Ctrl+Q') exitAct.setStatusTip(exitTip) exitAct.triggered.connect(qApp.quit) newAct = QAction('&' + newName, self) newAct.setShortcut('Ctrl+N') newAct.setStatusTip(newTip) newAct.triggered.connect(self.showNewDialog) openAct = QAction('&' + openName, self) # openAct.setShortcut('Ctrl+Q') openAct.setStatusTip(openTip) openAct.triggered.connect(self.notImplemented) closeAct = QAction('&' + closeName, self) # closeAct.setShortcut('Ctrl+Q') closeAct.setStatusTip(closeTip) closeAct.triggered.connect(self.notImplemented) importAct = QAction('&' + impName, self) # importAct.setShortcut('Ctrl+Q') importAct.setStatusTip(impTip) importAct.triggered.connect(self.notImplemented) exportAct = QAction('&' + expName, self) # exportAct.setShortcut('Ctrl+Q') exportAct.setStatusTip(expTip) exportAct.triggered.connect(self.notImplemented) self.mouse1stAct = QAction('&' + m1stName, self, checkable=True) # self.mouse1stAct.setShortcut('F6') self.mouse1stAct.setStatusTip(m1stTip) self.mouse1stAct.setChecked( self.guiState.value('mouse_first_enabled', type=bool)) self.mouse1stAct.setObjectName('mouse_first') self.mouse1stAct.triggered.connect(self.switchModes) self.script1stAct = QAction('&' + s1stName, self, checkable=True) # self.script1stAct.setShortcut('F6') self.script1stAct.setStatusTip(s1stTip) self.script1stAct.setChecked( self.guiState.value('script_first_enabled', type=bool)) self.script1stAct.setObjectName('script_first') self.script1stAct.triggered.connect(self.switchModes) paramsAct = QAction('&' + pEdName, self, checkable=True) # paramsAct.setShortcut('F6') paramsAct.setStatusTip(pEdTip) paramsAct.setChecked(False) paramsAct.setObjectName('parameters_editor') paramsAct.triggered.connect(self.notImplemented) objectAct = QAction('&' + viewerName, self, checkable=True) # objectAct.setShortcut('F6') objectAct.setStatusTip(viewerTip) objectAct.setChecked(False) objectAct.setObjectName('object_viewer') objectAct.triggered.connect(self.notImplemented) pythonAct = QAction('&' + conName, self, checkable=True) # pythonAct.setShortcut('F6') pythonAct.setStatusTip(conTip) pythonAct.setChecked(False) pythonAct.setObjectName('python_console') pythonAct.triggered.connect(self.notImplemented) self.dockAct = QAction('&' + dockName, self, checkable=True) self.dockAct.setStatusTip(dockName) self.dockAct.setChecked(True) self.dockAct.setObjectName('dock_panel') self.dockAct.triggered.connect(self.toggleDock) libsAct = QAction('&' + libsName, self) # libsAct.setShortcut('F6') libsAct.setStatusTip(libsTip) libsAct.triggered.connect(self.notImplemented) extsAct = QAction('&' + extsName, self) # extsAct.setShortcut('F6') extsAct.setStatusTip(extsTip) extsAct.triggered.connect(self.notImplemented) layoutsAct = QAction('&' + layoutsName, self) # layoutsAct.setShortcut('F6') layoutsAct.setStatusTip(layoutsTip) layoutsAct.triggered.connect(self.notImplemented) frontViewAct = QAction(QIcon('content/images/front_view.svg'), '&' + frontViewName, self) frontViewAct.setShortcut('1') frontViewAct.setStatusTip(frontViewTip) frontViewAct.triggered.connect(self.notImplemented) backViewAct = QAction(QIcon('content/images/back_view.svg'), '&' + backViewName, self) backViewAct.setShortcut('2') backViewAct.setStatusTip(backViewTip) backViewAct.triggered.connect(self.notImplemented) topViewAct = QAction(QIcon('content/images/top_view.svg'), '&' + topViewName, self) topViewAct.setShortcut('3') topViewAct.setStatusTip(topViewTip) topViewAct.triggered.connect(self.notImplemented) bottomViewAct = QAction(QIcon('content/images/bottom_view.svg'), '&' + bottomViewName, self) bottomViewAct.setShortcut('4') bottomViewAct.setStatusTip(bottomViewTip) bottomViewAct.triggered.connect(self.notImplemented) leftViewAct = QAction(QIcon('content/images/left_side_view.svg'), '&' + leftViewName, self) leftViewAct.setShortcut('5') leftViewAct.setStatusTip(leftViewTip) leftViewAct.triggered.connect(self.notImplemented) rightViewAct = QAction(QIcon('content/images/right_side_view.svg'), '&' + rightViewName, self) rightViewAct.setShortcut('6') rightViewAct.setStatusTip(rightViewTip) rightViewAct.triggered.connect(self.notImplemented) axioViewAct = QAction(QIcon('content/images/axiometric_view.svg'), '&' + axioViewName, self) axioViewAct.setShortcut('0') axioViewAct.setStatusTip(axioViewTip) axioViewAct.triggered.connect(self.notImplemented) fitAllAct = QAction(QIcon('content/images/fit_all.svg'), '&' + fitAllName, self) # fitAllAct.setShortcut('6') fitAllAct.setStatusTip(fitAllTip) fitAllAct.triggered.connect(self.notImplemented) settingsAct = QAction('&' + setsName, self) # settingsAct.setShortcut('F6') settingsAct.setStatusTip(setsTip) settingsAct.triggered.connect(self.showSettingsDialog) docsAct = QAction('&' + docsName, self) # docsAct.setShortcut('F1') docsAct.setStatusTip(docsTip) docsAct.triggered.connect(self.notImplemented) vidsAct = QAction('&' + vidsName, self) # vidsAct.setShortcut('F1') vidsAct.setStatusTip(vidsTip) vidsAct.triggered.connect(self.notImplemented) uGroupAct = QAction('&' + uGroupName, self) # uGroupAct.setShortcut('F1') uGroupAct.setStatusTip(uGroupTip) uGroupAct.triggered.connect(self.notImplemented) aboutAct = QAction(QIcon('content/images/Material/ic_help_24px.svg'), '&' + abtName, self) aboutAct.setShortcut('F1') aboutAct.setStatusTip(abtTip) aboutAct.triggered.connect(self.clickAbout) self.helpAct = QAction( QIcon('content/images/Material/ic_help_24px.svg'), '&' + abtName, self) # self.helpAct.setShortcut('F1') self.helpAct.setStatusTip(abtTip) self.helpAct.triggered.connect(self.clickHelp) self.menubar = self.menuBar() self.fileMenu = self.menubar.addMenu('&' + fileName) self.fileMenu.addAction(newAct) self.fileMenu.addAction(openAct) self.fileMenu.addAction(closeAct) self.recentMenu = QMenu(rcntName, self) self.fileMenu.addMenu(self.recentMenu) self.examplesMenu = QMenu(exName, self) self.fileMenu.addMenu(self.examplesMenu) self.fileMenu.addSeparator() self.fileMenu.addAction(importAct) self.fileMenu.addAction(exportAct) self.fileMenu.addSeparator() self.fileMenu.addAction(exitAct) editMenu = self.menubar.addMenu('&' + editName) editMenu.addAction(libsAct) editMenu.addAction(extsAct) editMenu.addAction(layoutsAct) editMenu.addAction(settingsAct) viewMenu = self.menubar.addMenu('&' + viewName) modesMenu = QMenu(modesName, self) viewMenu.addMenu(modesMenu) modesMenu.addAction(self.mouse1stAct) modesMenu.addAction(self.script1stAct) panelsMenu = QMenu(panelsName, self) panelsMenu.addAction(paramsAct) panelsMenu.addAction(objectAct) panelsMenu.addAction(pythonAct) panelsMenu.addAction(self.dockAct) viewMenu.addMenu(panelsMenu) self.layoutMenu = QMenu(layoutMenuName) viewMenu.addMenu(self.layoutMenu) # projMenu = menubar.addMenu('&Project') self.helpMenu = self.menubar.addMenu('&' + helpName) self.helpMenu.addAction(docsAct) self.helpMenu.addAction(vidsAct) self.helpMenu.addAction(uGroupAct) self.helpMenu.addAction(aboutAct) # Load layouts dynamically (layouts, self.funcs) = self.getLayouts() for layout in layouts: act = QAction('&' + layout, self) act.setStatusTip(layout) act.setObjectName(layout.replace(' ', '_').lower()) act.triggered.connect(self.fireFunction) self.layoutMenu.addAction(act) # The CadQuery logo # logoLabel = QLabel() # logoLabel.setPixmap(QPixmap('content/images/cadquery_logo_dark.svg')) # Toolbar for CAD controls and extension controls self.toolbar = self.addToolBar('Main Tools') # self.toolbar.addWidget(logoLabel) self.toolbar.addAction(frontViewAct) self.toolbar.addAction(backViewAct) self.toolbar.addAction(topViewAct) self.toolbar.addAction(bottomViewAct) self.toolbar.addAction(leftViewAct) self.toolbar.addAction(rightViewAct) self.toolbar.addAction(axioViewAct) self.toolbar.addAction(fitAllAct) self.toolbar.addSeparator() self.toolbar.addAction(self.helpAct) # Drop-dowm menu that lets users select which extensions they want active self.extsButton = QToolButton(self.toolbar) self.extsButton.setIcon( QIcon('content/images/Material/ic_extension_black_24px.svg')) self.extsMenu = QMenu(self.extsButton) self.extsButton.clicked.connect(self.toggleExtsMenuVisibility) self.extsButton.setMenu(self.extsMenu) self.extsButton.setPopupMode(QToolButton.MenuButtonPopup) # Start up all extensions self.loadExtensions() # Add the extensions dropdown at the right side of the toolbar spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.toolbar.addWidget(spacer) self.toolbar.addWidget(self.extsButton) # Side dock for things like the object viewer self.dock = DockWidget(self) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock) self.dock.setMinimumSize(200, 100) self.setInitialDockState() self.showMaximized()
class EditorMainWindow(object): def __init__(self): self.seq = 0 self.widget = loadUi(MAIN_UI_PATH) self.init_mdi() self.init_actions() self.init_instance() self.widget.closeEvent = self.close_handler self.widget.showMaximized() def get_seq(self): self.seq += 1 return self.seq def init_mdi(self): self.mdi = QMdiArea(self.widget) self.mdi.setViewMode(QMdiArea.TabbedView) self.mdi.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdi.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdi.setTabsMovable(True) self.mdi.setTabsClosable(True) self.mdi.setTabShape(QTabWidget.Rounded) self.widget.setCentralWidget(self.mdi) def init_actions(self): self.widget.actionNew.triggered.connect(self.action_new_handler) self.widget.actionOpen.triggered.connect(self.action_open_handler) self.widget.actionSave.triggered.connect(self.action_save_handler) self.widget.actionSave_As.triggered.connect(self.action_save_as_handler) self.widget.actionClose.triggered.connect(self.action_close_handler) self.widget.actionClose_All.triggered.connect(self.action_close_all_handler) self.widget.actionExport.triggered.connect(self.action_export_handler) self.widget.actionStates.triggered.connect(self.action_states_handler) self.widget.actionEvents.triggered.connect(self.action_events_handler) def close_handler(self, ev): l = self.mdi.subWindowList() if len(l) != 0: self.mdi.closeAllSubWindows() ev.ignore() def init_instance(self): self.instances = [] def remove_instance(self, ins): self.instances.remove(ins) def find_non_existing_name(self): while True: tmp_path = os.path.join( config.src_path, "NewFsm" + str(self.get_seq()) + FSM_FILE_EXT) if not os.path.exists(tmp_path): return tmp_path def action_new_handler(self): tmp_path = self.find_non_existing_name() m = FsmModel() m.default_init() vm = InstanceVM(m, self, tmp_path) vm.set_modified(True) def file_already_open(self, pth): for i in self.instances: pth = os.path.abspath(pth) if pth == i.file_path: return i return None def action_open_handler(self): p = QFileDialog() p.setViewMode(QFileDialog.List) p.setFileMode(QFileDialog.ExistingFiles) p.setDirectory(config.src_path) p.exec() paths = p.selectedFiles() for pth in paths: i = self.file_already_open(pth) if i: self.mdi.setActiveSubWindow(i.sub_window) else: m = FsmModel.load_file(pth) vm = InstanceVM(m, self, pth) def action_save_handler(self): w = self.mdi.activeSubWindow() if w is None: return model = w.instance.model model.dump_file(w.instance.file_path) w.instance.set_modified(False) def action_save_as_handler(self): w = self.mdi.activeSubWindow() if w is None: return p = QFileDialog() p.setViewMode(QFileDialog.List) p.setDirectory(config.src_path) p.exec() paths = p.selectedFiles() if len(paths) == 0: return w.instance.file_path = os.path.abspath(paths[0]) w.instance.update_title() model = w.instance.model model.dump_file(w.instance.file_path) w.instance.set_modified(False) def action_close_handler(self): w = self.mdi.activeSubWindow() if w is None: return w.close() def action_close_all_handler(self): self.mdi.closeAllSubWindows() def action_export_handler(self): fsm_files = os.listdir(config.src_path) for fn in fsm_files: full_name = os.path.join(config.src_path, fn) b, e = os.path.splitext(full_name) if e == FSM_FILE_EXT: f = open(full_name, "rb") basename, e = os.path.splitext(fn) model_object = pickle.load(f) f.close() exporter = FsmModelPythonExporter(model_object) exporter.export(os.path.join(config.export_path, basename + "_fsm.py")) def action_states_handler(self): cur = self.get_current_instance() if cur is None: return model = cur.model w = loadUi(STATE_LIST_DIALOG_PATH) list_vm = MultiColumnListModel( model.state, LIST_DIALOG_COLUMNS, STATE_DIALOG_HEADERS) add_item = functools.partial(model.add_item, StateItem, "state") remove_item = functools.partial(model.remove_item, "state") dialog = StateListPanelVM( list_vm, model.state, add_item, remove_item, w) dialog.run() cur.table_vm.refresh() def action_events_handler(self): cur = self.get_current_instance() if cur is None: return model = cur.model w = loadUi(EVENT_DIALOG_PATH) list_vm = MultiColumnListModel( model.event, LIST_DIALOG_COLUMNS, EVENT_DIALOG_HEADERS) add_item = functools.partial(model.add_item, EventItem, "event") remove_item = functools.partial(model.remove_item, "event") dialog = ListEditPanelVM( list_vm, model.event, add_item, remove_item, w) dialog.run() cur.table_vm.refresh() def get_current_instance(self): current = self.mdi.activeSubWindow() if not current: return None for i in self.instances: if i.sub_window == current: return i assert(False) # there is an active sub window but there's no matching instance
class EditorMainWindow(object): def __init__(self): self.seq = 0 self.widget = loadUi(MAIN_UI_PATH) self.init_mdi() self.init_actions() self.init_instance() self.widget.closeEvent = self.close_handler self.widget.showMaximized() def get_seq(self): self.seq += 1 return self.seq def init_mdi(self): self.mdi = QMdiArea(self.widget) self.mdi.setViewMode(QMdiArea.TabbedView) self.mdi.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdi.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdi.setTabsMovable(True) self.mdi.setTabsClosable(True) self.mdi.setTabShape(QTabWidget.Rounded) self.widget.setCentralWidget(self.mdi) def init_actions(self): self.widget.actionNew.triggered.connect(self.action_new_handler) self.widget.actionOpen.triggered.connect(self.action_open_handler) self.widget.actionSave.triggered.connect(self.action_save_handler) self.widget.actionSave_As.triggered.connect( self.action_save_as_handler) self.widget.actionClose.triggered.connect(self.action_close_handler) self.widget.actionClose_All.triggered.connect( self.action_close_all_handler) self.widget.actionExport.triggered.connect(self.action_export_handler) self.widget.actionStates.triggered.connect(self.action_states_handler) self.widget.actionEvents.triggered.connect(self.action_events_handler) def close_handler(self, ev): l = self.mdi.subWindowList() if len(l) != 0: self.mdi.closeAllSubWindows() ev.ignore() def init_instance(self): self.instances = [] def remove_instance(self, ins): self.instances.remove(ins) def find_non_existing_name(self): while True: tmp_path = os.path.join( config.src_path, "NewFsm" + str(self.get_seq()) + FSM_FILE_EXT) if not os.path.exists(tmp_path): return tmp_path def action_new_handler(self): tmp_path = self.find_non_existing_name() m = FsmModel() m.default_init() vm = InstanceVM(m, self, tmp_path) vm.set_modified(True) def file_already_open(self, pth): for i in self.instances: pth = os.path.abspath(pth) if pth == i.file_path: return i return None def action_open_handler(self): p = QFileDialog() p.setViewMode(QFileDialog.List) p.setFileMode(QFileDialog.ExistingFiles) p.setDirectory(config.src_path) p.exec() paths = p.selectedFiles() for pth in paths: i = self.file_already_open(pth) if i: self.mdi.setActiveSubWindow(i.sub_window) else: m = FsmModel.load_file(pth) vm = InstanceVM(m, self, pth) def action_save_handler(self): w = self.mdi.activeSubWindow() if w is None: return model = w.instance.model model.dump_file(w.instance.file_path) w.instance.set_modified(False) def action_save_as_handler(self): w = self.mdi.activeSubWindow() if w is None: return p = QFileDialog() p.setViewMode(QFileDialog.List) p.setDirectory(config.src_path) p.exec() paths = p.selectedFiles() if len(paths) == 0: return w.instance.file_path = os.path.abspath(paths[0]) w.instance.update_title() model = w.instance.model model.dump_file(w.instance.file_path) w.instance.set_modified(False) def action_close_handler(self): w = self.mdi.activeSubWindow() if w is None: return w.close() def action_close_all_handler(self): self.mdi.closeAllSubWindows() def action_export_handler(self): fsm_files = os.listdir(config.src_path) for fn in fsm_files: full_name = os.path.join(config.src_path, fn) b, e = os.path.splitext(full_name) if e == FSM_FILE_EXT: f = open(full_name, "rb") basename, e = os.path.splitext(fn) model_object = pickle.load(f) f.close() exporter = FsmModelPythonExporter(model_object) exporter.export( os.path.join(config.export_path, basename + "_fsm.py")) def action_states_handler(self): cur = self.get_current_instance() if cur is None: return model = cur.model w = loadUi(STATE_LIST_DIALOG_PATH) list_vm = MultiColumnListModel(model.state, LIST_DIALOG_COLUMNS, STATE_DIALOG_HEADERS) add_item = functools.partial(model.add_item, StateItem, "state") remove_item = functools.partial(model.remove_item, "state") dialog = StateListPanelVM(list_vm, model.state, add_item, remove_item, w) dialog.run() cur.table_vm.refresh() def action_events_handler(self): cur = self.get_current_instance() if cur is None: return model = cur.model w = loadUi(EVENT_DIALOG_PATH) list_vm = MultiColumnListModel(model.event, LIST_DIALOG_COLUMNS, EVENT_DIALOG_HEADERS) add_item = functools.partial(model.add_item, EventItem, "event") remove_item = functools.partial(model.remove_item, "event") dialog = ListEditPanelVM(list_vm, model.event, add_item, remove_item, w) dialog.run() cur.table_vm.refresh() def get_current_instance(self): current = self.mdi.activeSubWindow() if not current: return None for i in self.instances: if i.sub_window == current: return i assert ( False ) # there is an active sub window but there's no matching instance
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createStatusBar() self.updateMenus() self.clipboard = QApplication.clipboard() self.setWindowTitle("Qt5 Multi Video Player v0.02 - by Luis Santos AKA DJOKER") def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: event.accept() def newFile(self): child = VideoPlayer(True) self.mdiArea.addSubWindow(child) url = self.clipboard.text() child.Player(url) child.show() def newMute(self): child = VideoPlayer(False) self.mdiArea.addSubWindow(child) url = self.clipboard.text() child.Player(url) child.show() return def updateMenus(self): hasMdiChild = (self.activeMdiChild() is not None) self.closeAct.setEnabled(hasMdiChild) self.closeAllAct.setEnabled(hasMdiChild) self.tileAct.setEnabled(hasMdiChild) self.cascadeAct.setEnabled(hasMdiChild) self.nextAct.setEnabled(hasMdiChild) self.previousAct.setEnabled(hasMdiChild) self.separatorAct.setVisible(hasMdiChild) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tileAct) self.windowMenu.addAction(self.cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) def createMdiChild(self): child = MdiChild() self.mdiArea.addSubWindow(child) return child def createActions(self): self.newAct = QAction( "&New", self, shortcut=QKeySequence.New, statusTip="Create a new Video Player", triggered=self.newFile) self.newActCam4 = QAction("&VideoMute", self, shortcut=QKeySequence.New, statusTip="Create a new Video Player Mute", triggered=self.newMute) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.tileAct = QAction("&Tile", self, statusTip="Tile the windows", triggered=self.mdiArea.tileSubWindows) self.cascadeAct = QAction("&Cascade", self, statusTip="Cascade the windows", triggered=self.mdiArea.cascadeSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction("Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.newActCam4) self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit, statusTip="Exit the application", triggered=QApplication.instance().closeAllWindows) self.fileMenu.addSeparator() action = self.fileMenu.addAction("Switch layout direction") action.triggered.connect(self.switchLayoutDirection) self.fileMenu.addAction(self.exitAct) self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() def createStatusBar(self): self.statusBar().showMessage("Ready") def activeMdiChild(self): activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() return None def findMdiChild(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def switchLayoutDirection(self): if self.layoutDirection() == Qt.LeftToRight: QApplication.setLayoutDirection(Qt.RightToLeft) else: QApplication.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window)
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setWindowTitle("De$compliconta$") self.setWindowIcon(Icon("main-icon.png")) self.area = QMdiArea() self.area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.area) DATABASE.showInfo() self.createMenus() self.createWindows() self.loadInfo() self.showMaximized() self.showMessage("Iniciado") def closeEvent(self, event): DATABASE.close() def createMenus(self): self.fileMenu = self.menuBar().addMenu("Arquivo") import_ = self.fileMenu.addAction("Importar Transações") import_.triggered.connect(self.importWindow) export_ = self.fileMenu.addAction("Exportar Transações") export_.triggered.connect(self.exportWindow) self.fileMenu.addSeparator() close_ = self.fileMenu.addAction("Fechar") close_.triggered.connect(self.close) self.operationsMenu = self.menuBar().addMenu("Operações") self.windowsMenu = self.menuBar().addMenu("Janelas") def createWindows(self): self.accWindow = AccountsWindow(self) self.area.addSubWindow(self.accWindow) self.accWindow.show() self.catWindow = CategoriesWindow(self) self.area.addSubWindow(self.catWindow) self.catWindow.show() self.transWindow = TransactionWindow(self) self.area.addSubWindow(self.transWindow) self.transWindow.show() self.investWindow = InvestimentsWindow(self) self.area.addSubWindow(self.investWindow) self.investWindow.show() self.graphsWindow = GraphWindow(self) self.area.addSubWindow(self.graphsWindow) self.graphsWindow.show() self.accWindow.createMenusAndToolbar() self.operationsMenu.addSeparator() self.catWindow.createMenusAndToolbar() self.operationsMenu.addSeparator() self.transWindow.createMenusAndToolbar() self.operationsMenu.addSeparator() self.investWindow.createMenusAndToolbar() def exportWindow(self): self.db.cursor.execute("""SELECT * FROM transactions""") result = self.db.cursor.fetchall() fileDir = QFileDialog.getSaveFileName(self, "Exportar para: ", os.environ["HOMEPATH"], "Transações (*.trans)") file = open(os.path.join(os.getcwd(), fileDir[0]), 'wb') pickle.dump(result, file) self.showMessage("%d transações exportadas." % len(result)) def importWindow(self): bar = QProgressBar() bar.setTextVisible(True) bar.setValue(0) fileDir = QLineEdit() fileDir.setReadOnly(True) start = QPushButton("Importar") def importItems(): try: transactions = pickle.load(open(fileDir.text(), "rb")) bar.setRange(0, len(transactions)) count = 0 for transaction in transactions: self.db.addTransaction(transaction[1:]) count += 1 bar.setValue(count) self.showMessage("%d transações importadas." % len(transactions)) start.setEnabled(False) except: self.showMessage("OPS! Algo deu errado.") dialog = QDialog(self) dialog.setWindowTitle("Importar Transações") layout = QGridLayout() layout.addWidget(QLabel("Arquivo: "), 0, 0) layout.addWidget(fileDir, 0, 1) search = QPushButton("...") search.clicked.connect(lambda: fileDir.setText( QFileDialog.getOpenFileName(dialog, "Importar de: ", os.environ[ 'HOMEPATH'], "Transações (*.trans)")[0])) layout.addWidget(search, 0, 2) layout.addWidget(QLabel("Progresso: "), 1, 0) layout.addWidget(bar, 1, 1, 1, 3) start.clicked.connect(importItems) layout.addWidget(start, 2, 1) dialog.setLayout(layout) dialog.exec_() def loadInfo(self): self.accWindow.loadInfo() self.catWindow.loadInfo() self.transWindow.loadInfo() self.investWindow.loadInfo() self.graphsWindow.updatePlot() def showMessage(self, text): msg = QDateTime.currentDateTime().toString("dd/MM/yyyy hh:mm ") msg += text print(msg) self.statusBar().showMessage(msg)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.updateMenus() self.readSettings() self.setWindowTitle("MDI Test") def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: self.writeSettings() event.accept() def newFile(self): child = self.createMdiChild() child.newFile() child.show() def open(self): fileName, _ = QFileDialog.getOpenFileName(self) if fileName: existing = self.findMdiChild(fileName) if existing: self.mdiArea.setActiveSubWindow(existing) return child = self.createMdiChild() if child.loadFile(fileName): self.statusBar().showMessage("File loaded", 2000) child.show() else: child.close() def save(self): if self.activeMdiChild() and self.activeMdiChild().save(): self.statusBar().showMessage("File saved", 2000) def saveAs(self): if self.activeMdiChild() and self.activeMdiChild().saveAs(): self.statusBar().showMessage("File saved", 2000) def cut(self): if self.activeMdiChild(): self.activeMdiChild().cut() def copy(self): if self.activeMdiChild(): self.activeMdiChild().copy() def paste(self): if self.activeMdiChild(): self.activeMdiChild().paste() def about(self): QMessageBox.about( self, "About MDI", "The <b>MDI</b> example demonstrates how to write multiple " "document interface applications using Qt.") def updateMenus(self): hasMdiChild = (self.activeMdiChild() is not None) #self.saveAct.setEnabled(hasMdiChild) #self.saveAsAct.setEnabled(hasMdiChild) self.pasteAct.setEnabled(hasMdiChild) self.closeAct.setEnabled(hasMdiChild) self.closeAllAct.setEnabled(hasMdiChild) self.tileAct.setEnabled(hasMdiChild) self.cascadeAct.setEnabled(hasMdiChild) self.nextAct.setEnabled(hasMdiChild) self.previousAct.setEnabled(hasMdiChild) self.separatorAct.setVisible(hasMdiChild) hasSelection = (self.activeMdiChild() is not None and self.activeMdiChild().textCursor().hasSelection()) self.cutAct.setEnabled(hasSelection) self.copyAct.setEnabled(hasSelection) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tileAct) self.windowMenu.addAction(self.cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.activeMdiChild()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def createMdiChild(self): child = MdiChild() self.mdiArea.addSubWindow(child) child.copyAvailable.connect(self.cutAct.setEnabled) child.copyAvailable.connect(self.copyAct.setEnabled) return child # showntell def createMdiChild15(self): child = MdiChild_ShowNTell() self.mdiArea.addSubWindow(child) return child #MNIST def show_n_tell(self): print('show_n_tell....') child = self.createMdiChild15() print('self.createMdiChild15') #child.resize(830,480) #print('self.createMdiChild15') child.show print('child.show()') def createActions(self): self.cutAct = QAction( QIcon(':/images/cut.png'), "Cu&t", self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection's contents to the clipboard", triggered=self.cut) self.copyAct = QAction( QIcon(':/images/copy.png'), "&Copy", self, shortcut=QKeySequence.Copy, statusTip="Copy the current selection's contents to the clipboard", triggered=self.copy) self.pasteAct = QAction( QIcon(':/images/paste.png'), "&Paste", self, shortcut=QKeySequence.Paste, statusTip= "Paste the clipboard's contents into the current selection", triggered=self.paste) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.tileAct = QAction("&Tile", self, statusTip="Tile the windows", triggered=self.mdiArea.tileSubWindows) self.cascadeAct = QAction("&Cascade", self, statusTip="Cascade the windows", triggered=self.mdiArea.cascadeSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction( "Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) # 메뉴 ACTION을 다이나믹하게 연결해준다 self.MenuActRef = { 'NewFileAct': 0, 'OpnFileAct': 0, 'SavFileAct': 0, 'SavASFileAct': 0, 'AboutAct': 0, 'AboutQTAct': 0, 'ExitAct': 0, 'SwitchLayout': 0, 'ShowNTell': 0 } # ******* Create the File Menu ******* self.NewFileAct = QAction(QIcon(':/images/new.png'), '&New File', self) self.NewFileAct.setShortcut("Ctrl+N") self.NewFileAct.setStatusTip('Create a New File') self.NewFileAct.triggered.connect(self.newFile) self.MenuActRef['NewFileAct'] = self.NewFileAct #self.newAct = QAction(QIcon(':/images/new.png'), "&New", self, # shortcut=QKeySequence.New, statusTip="Create a new file", # triggered=self.newFile) # ******* Open File Menu Items ******* self.OpnFileAct = QAction(QIcon(':/images/open.png'), '&Open File', self) self.OpnFileAct.setShortcut("Ctrl+O") self.OpnFileAct.setStatusTip('Open an Existing File') self.OpnFileAct.triggered.connect(self.open) self.MenuActRef['OpnFileAct'] = self.OpnFileAct #self.openAct = QAction(QIcon(':/images/open.png'), "&Open...", self, # shortcut=QKeySequence.Open, statusTip="Open an existing file", # triggered=self.open) # ******* Save File Menu Items ******* self.SavFileAct = QAction(QIcon(':/images/save.png'), '&Save File', self) self.SavFileAct.setShortcut("Ctrl+S") self.SavFileAct.setStatusTip('Save Current File') self.SavFileAct.triggered.connect(self.save) self.MenuActRef['SavFileAct'] = self.SavFileAct #self.saveAct = QAction(QIcon(':/images/save.png'), "&Save", self, # shortcut=QKeySequence.Save, # statusTip="Save the document to disk", triggered=self.save) # ******* SaveAS File Menu Items ******* self.SavASFileAct = QAction('Save &As File', self) self.SavASFileAct.setShortcut("Ctrl+A") self.SavASFileAct.setStatusTip('Save Current File under a new name ') self.SavASFileAct.triggered.connect(self.saveAs) self.MenuActRef['SavASFileAct'] = self.SavASFileAct #self.saveAsAct = QAction("Save &As...", self, # shortcut=QKeySequence.SaveAs, # statusTip="Save the document under a new name", # triggered=self.saveAs) # ******* About Menu Items ******* self.aboutAct = QAction("&About", self) self.aboutAct.setStatusTip("Show the application's About box") self.aboutAct.triggered.connect(self.about) self.MenuActRef['AboutAct'] = self.aboutAct # ******* About QT Menu Items ******* self.aboutAct = QAction("About &Qt", self) self.aboutAct.setStatusTip("Show the Qt library's About box") self.aboutAct.triggered.connect(QApplication.instance().aboutQt) self.MenuActRef['AboutQTAct'] = self.aboutAct # ******* Exit Menu Items ******* self.exitAct = QAction("E&xit", self) self.exitAct.setStatusTip("Exit the application") self.exitAct.triggered.connect(QApplication.instance().closeAllWindows) self.MenuActRef['ExitAct'] = self.exitAct #self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit, # statusTip="Exit the application", # triggered=QApplication.instance().closeAllWindows) # ******* Switch layout Items ******* self.SwitchLayout = QAction("&Switch layout direction", self) self.SwitchLayout.setStatusTip("Switch layout direction") self.SwitchLayout.triggered.connect(self.switchLayoutDirection) self.MenuActRef['SwitchLayout'] = self.SwitchLayout #self.SwitchLayout = QAction("&Switch layout direction", self, # statusTip="Switch layout direction", # triggered=self.switchLayoutDirection) # ******* Switch layout Items ******* self.ShowNTell = QAction("&ShowNTell", self) self.ShowNTell.setStatusTip("&ShowNTell") self.ShowNTell.triggered.connect(self.show_n_tell) self.MenuActRef['ShowNTell'] = self.ShowNTell #self.ShowNTell = QAction("&show_n_tell", self, # statusTip="show_n_tell", # triggered=self.show_n_tell) def createMenus(self): # 메뉴를 다이나믹하게 생성하고 연결함 self.MenuLayout = { 0: { 'addMenu': '&File', 'addToolMenu': 'File' }, 1: { 'addDynamic': 'NewFileAct', 'addToolbar': 'NewFileAct' }, 2: { 'addDynamic': 'OpnFileAct', 'addToolbar': 'OpnFileAct' }, 3: { 'addDynamic': 'SavFileAct', 'addToolbar': 'SavFileAct' }, 4: { 'addDynamic': 'SavASFileAct' }, 5: { 'addSeparator': '' }, 6: { 'addDynamic': 'SwitchLayout' }, 7: { 'addDynamic': 'ExitAct' }, 8: { 'addMenu': '&Edit' }, 9: { 'addAction': self.cutAct }, 10: { 'addAction': self.copyAct }, 11: { 'addAction': self.pasteAct }, 12: { 'addMenu': '&Window' }, 13: { 'updateMenu': '' }, 14: { 'addSeparator': '' }, 15: { 'addMenu': '&Help' }, 16: { 'addDynamic': 'AboutAct' }, 17: { 'addDynamic': 'AboutQTAct' }, 18: { 'addMenu': '&MNIST' }, 19: { 'addDynamic': 'ShowNTell' } } for idx in self.MenuLayout: item = self.MenuLayout[idx] if 'addMenu' in item.keys(): self.windowMenu = self.menuBar().addMenu(item['addMenu']) elif 'addAction' in item.keys(): self.windowMenu.addAction(item['addAction']) elif 'addSeparator' in item.keys(): self.windowMenu.addSeparator() elif 'updateMenu' in item.keys(): self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) # 메뉴 ACTION을 다이나믹하게 elif 'addDynamic' in item.keys(): self.windowMenu.addAction(self.MenuActRef[item['addDynamic']]) def createToolBars(self): for idx in self.MenuLayout: item = self.MenuLayout[idx] if 'addToolMenu' in item.keys(): self.fileToolBar = self.addToolBar(item['addToolMenu']) elif 'addToolbar' in item.keys(): self.fileToolBar.addAction(self.MenuActRef[item['addDynamic']]) #self.fileToolBar = self.addToolBar("File") #self.fileToolBar.addAction(self.MenuActRef['NewFileAct']) #self.fileToolBar.addAction(self.MenuActRef['OpnFileAct']) #self.fileToolBar.addAction(self.MenuActRef['SavFileAct']) #self.fileToolBar.addAction(self.newAct) #self.fileToolBar.addAction(self.openAct) #self.fileToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar("Edit") self.editToolBar.addAction(self.cutAct) self.editToolBar.addAction(self.copyAct) self.editToolBar.addAction(self.pasteAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def readSettings(self): settings = QSettings('NH-Soft', 'MDI Example') pos = settings.value('pos', QPoint(200, 200)) size = settings.value('size', QSize(400, 400)) self.move(pos) self.resize(size) def writeSettings(self): settings = QSettings('NH-Soft', 'MDI Example') settings.setValue('pos', self.pos()) settings.setValue('size', self.size()) def activeMdiChild(self): activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() return None def findMdiChild(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def switchLayoutDirection(self): if self.layoutDirection() == Qt.LeftToRight: QApplication.setLayoutDirection(Qt.RightToLeft) else: QApplication.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.update_menus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped.connect(self.set_active_sub_window) self.newAct = QAction(self) self.newAct.setIcon(self.style().standardIcon(QStyle.SP_FileIcon)) # self.newAct.setIcon(QIcon(':/images/new.png')) self.newAct.setIconText('New') self.newAct.setShortcut(QKeySequence.New) self.newAct.setStatusTip('Create a new file') self.newAct.triggered.connect(self.new_file) self.openAct = QAction(self) self.openAct.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon)) self.openAct.setIconText('Open...') self.openAct.setShortcut(QKeySequence.Open) self.openAct.setStatusTip('Open an existing file') self.openAct.triggered.connect(self.open) self.saveAct = QAction(self) self.saveAct.setIcon(self.style().standardIcon(QStyle.SP_DialogSaveButton)) self.saveAct.setIconText('Save') self.saveAct.setShortcut(QKeySequence.Save) self.saveAct.setStatusTip('Save the document to disk') self.saveAct.triggered.connect(self.save) self.saveAsAct = QAction(self) self.saveAsAct.setIconText('Save As...') self.saveAsAct.setShortcut(QKeySequence.SaveAs) self.saveAsAct.setStatusTip('Save the document under a new name') self.saveAsAct.triggered.connect(self.save_as) self.exitAct = QAction(self) self.exitAct.setIconText('Exit') self.exitAct.setShortcut(QKeySequence.Quit) self.exitAct.setStatusTip('Exit the application') self.exitAct.triggered.connect(qApp.closeAllWindows) self.cutAct = QAction(self) # self.cutAct.setIcon(QIcon(':/images/cut.png')) self.cutAct.setIconText('Cut') self.cutAct.setShortcut(QKeySequence.Cut) self.cutAct.setStatusTip("Cut the current selection's contents to the clipboard") self.cutAct.triggered.connect(self.cut) self.copyAct = QAction(self) # self.copyAct.setIcon(QIcon(':/images/copy.png')) self.copyAct.setIconText('Copy') self.copyAct.setShortcut(QKeySequence.Copy) self.copyAct.setStatusTip("Copy the current selection's contents to the clipboard") self.copyAct.triggered.connect(self.copy) self.pasteAct = QAction(self) # self.pasteAct.setIcon(QIcon(':/images/paste.png')) self.pasteAct.setIconText('Paste') self.pasteAct.setShortcut(QKeySequence.Paste) self.pasteAct.setStatusTip("Paste the clipboard's contents into the current selection") self.pasteAct.triggered.connect(self.paste) self.closeAct = QAction(self) self.closeAct.setIconText('Close') self.closeAct.setShortcut('Ctrl+W') self.closeAct.setStatusTip("Close the active window") self.closeAct.triggered.connect(self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction(self) self.closeAllAct.setIconText('Close All') self.closeAllAct.setStatusTip('Close all the windows') self.closeAllAct.triggered.connect(self.mdiArea.closeAllSubWindows) self.tileAct = QAction(self) self.tileAct.setIconText('Tile') self.tileAct.setStatusTip('Tile the windows') self.tileAct.triggered.connect(self.mdiArea.tileSubWindows) self.cascadeAct = QAction(self) self.cascadeAct.setIconText('Cascade') self.cascadeAct.setStatusTip('Cascade the windows') self.cascadeAct.triggered.connect(self.mdiArea.cascadeSubWindows) self.nextAct = QAction(self) self.nextAct.setIconText('Next') self.nextAct.setShortcut(QKeySequence.NextChild) self.nextAct.setStatusTip('Move the focus to the next window') self.nextAct.triggered.connect(self.mdiArea.activateNextSubWindow) self.previousAct = QAction(self) self.previousAct.setIconText('Previous') self.previousAct.setShortcut(QKeySequence.PreviousChild) self.previousAct.setStatusTip('Move the focus to the previous window') self.previousAct.triggered.connect(self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) self.aboutAct = QAction(self) self.aboutAct.setIconText('About') self.aboutAct.setStatusTip("Show the application's About box") self.aboutAct.triggered.connect(self.about) self.aboutQtAct = QAction(self) self.aboutQtAct.setIconText('About Qt') self.aboutQtAct.setStatusTip("Show the Qt library's About box") self.aboutQtAct.triggered.connect(qApp.aboutQt) self.fileMenu = self.menuBar().addMenu('File') self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.saveAct) self.fileMenu.addAction(self.saveAsAct) self.fileMenu.addSeparator() action = self.fileMenu.addAction('Switch layout direction') action.triggered.connect(self.switch_layout_direction) self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu('Edit') self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.windowMenu = self.menuBar().addMenu('Window') self.update_window_menu() self.windowMenu.aboutToShow.connect(self.update_window_menu) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu('Help') self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) self.file_tool_bar = self.addToolBar('File') self.file_tool_bar.addAction(self.newAct) self.file_tool_bar.addAction(self.openAct) self.file_tool_bar.addAction(self.saveAct) self.edit_tool_bar = self.addToolBar('Edit') self.edit_tool_bar.addAction(self.cutAct) self.edit_tool_bar.addAction(self.copyAct) self.edit_tool_bar.addAction(self.pasteAct) self.statusBar().showMessage('Ready') self.update_menus() self.settings = QSettings('SavSoft', 'Combiner') self.last_directory: str = '' self.read_settings() self.setWindowTitle('MDI') self.setUnifiedTitleAndToolBarOnMac(True) def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.active_mdi_child(): event.ignore() else: self.write_settings() event.accept() def new_file(self): child = self.create_mdi_child() child.new_file() child.show() def open(self): filters = ['IRTECON files (*.grd)', 'Plain text files (*.csv *.tsv *.dat *.txt)'] file_name, _ = QFileDialog.getOpenFileName(self, filter=';;'.join(filters), directory=self.last_directory, options=QFileDialog.DontUseNativeDialog) if file_name: child = self.create_mdi_child() if QFileInfo(file_name).suffix() == 'grd': if child.load_irtecon_file(file_name): self.statusBar().showMessage('File loaded', 2000) self.last_directory = QFileInfo(file_name).dir().absolutePath() child.show() else: child.close() else: print(PlainTextImportDialog(file_name).exec()) raise NotImplementedError def save(self): if self.active_mdi_child() and self.active_mdi_child().save(): self.statusBar().showMessage('File saved', 2000) def save_as(self): if self.active_mdi_child() and self.active_mdi_child().save_as(): self.statusBar().showMessage('File saved', 2000) def cut(self): if self.active_mdi_child(): self.active_mdi_child().cut() def copy(self): if self.active_mdi_child(): self.active_mdi_child().copy() def paste(self): if self.active_mdi_child(): self.active_mdi_child().paste() def about(self): QMessageBox.about(self, 'About MDI', 'The <b>MDI</b> example demonstrates how to write multiple ' 'document interface applications using Qt.') def update_menus(self): has_mdi_child = (self.active_mdi_child() is not None) self.saveAct.setEnabled(has_mdi_child) self.saveAsAct.setEnabled(has_mdi_child) self.pasteAct.setEnabled(has_mdi_child) self.closeAct.setEnabled(has_mdi_child) self.closeAllAct.setEnabled(has_mdi_child) self.tileAct.setEnabled(has_mdi_child) self.cascadeAct.setEnabled(has_mdi_child) self.nextAct.setEnabled(has_mdi_child) self.previousAct.setEnabled(has_mdi_child) self.separatorAct.setVisible(has_mdi_child) def update_window_menu(self): self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tileAct) self.windowMenu.addAction(self.cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) for i, window in enumerate(windows): child = window.widget() text = f'{i + 1:d} {child.user_friendly_current_file()}' if i < 9: text = '' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child == self.active_mdi_child()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def create_mdi_child(self): child = MDIChildPlot() self.mdiArea.addSubWindow(child) return child def read_settings(self): pos = self.settings.value('pos', QPoint(200, 200)) self.move(pos) size = self.settings.value('size', QSize(400, 400)) self.resize(size) self.last_directory = self.settings.value('directory', '') def write_settings(self): self.settings.setValue('pos', self.pos()) self.settings.setValue('size', self.size()) self.settings.setValue('directory', self.last_directory) def active_mdi_child(self): active_sub_window = self.mdiArea.activeSubWindow() if active_sub_window: return active_sub_window.widget() return None def switch_layout_direction(self): if self.layoutDirection() == Qt.LeftToRight: qApp.setLayoutDirection(Qt.RightToLeft) else: qApp.setLayoutDirection(Qt.LeftToRight) def set_active_sub_window(self, window): if window: self.mdiArea.setActiveSubWindow(window)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createStatusBar() self.updateMenus() self.setWindowTitle("MDI") def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: event.accept() def newFile(self): child = BrowserChaturbate(self.mdiArea) self.mdiArea.addSubWindow(child) child.load("https://www.chaturbate.com/") child.resize(320, 240) child.show() def newCam4(self): child = BrowserCam4(self.mdiArea) self.mdiArea.addSubWindow(child) child.load("https://www.cam4.com") child.resize(320, 240) child.show() def newFreecam(self): child = BrowserMyFreeCams(self.mdiArea) self.mdiArea.addSubWindow(child) #child.load("https://www.myfreecams.com/php/online_models_splash.php?") child.load('https://www.pornhub.com/categories?o=al') child.resize(320, 240) child.show() def updateMenus(self): hasMdiChild = (self.activeMdiChild() is not None) self.closeAct.setEnabled(hasMdiChild) self.closeAllAct.setEnabled(hasMdiChild) self.tileAct.setEnabled(hasMdiChild) self.cascadeAct.setEnabled(hasMdiChild) self.nextAct.setEnabled(hasMdiChild) self.previousAct.setEnabled(hasMdiChild) self.separatorAct.setVisible(hasMdiChild) def updateWindowMenu(self): self.windowMenu.clear() self.windowMenu.addAction(self.closeAct) self.windowMenu.addAction(self.closeAllAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.tileAct) self.windowMenu.addAction(self.cascadeAct) self.windowMenu.addSeparator() self.windowMenu.addAction(self.nextAct) self.windowMenu.addAction(self.previousAct) self.windowMenu.addAction(self.separatorAct) windows = self.mdiArea.subWindowList() self.separatorAct.setVisible(len(windows) != 0) def createActions(self): self.newAct = QAction("&Chartubate", self, shortcut=QKeySequence.New, statusTip="Browse Chartubate", triggered=self.newFile) self.newActCam4 = QAction("&Cam4", self, shortcut=QKeySequence.New, statusTip="Browse Cam4", triggered=self.newCam4) self.newActFreeCam = QAction("&PornHub", self, shortcut=QKeySequence.New, statusTip="Browse PornHub", triggered=self.newFreecam) self.closeAct = QAction("Cl&ose", self, statusTip="Close the active window", triggered=self.mdiArea.closeActiveSubWindow) self.closeAllAct = QAction("Close &All", self, statusTip="Close all the windows", triggered=self.mdiArea.closeAllSubWindows) self.tileAct = QAction("&Tile", self, statusTip="Tile the windows", triggered=self.mdiArea.tileSubWindows) self.cascadeAct = QAction("&Cascade", self, statusTip="Cascade the windows", triggered=self.mdiArea.cascadeSubWindows) self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild, statusTip="Move the focus to the next window", triggered=self.mdiArea.activateNextSubWindow) self.previousAct = QAction( "Pre&vious", self, shortcut=QKeySequence.PreviousChild, statusTip="Move the focus to the previous window", triggered=self.mdiArea.activatePreviousSubWindow) self.separatorAct = QAction(self) self.separatorAct.setSeparator(True) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.newActCam4) self.fileMenu.addAction(self.newActFreeCam) self.exitAct = QAction( "E&xit", self, shortcut=QKeySequence.Quit, statusTip="Exit the application", triggered=QApplication.instance().closeAllWindows) self.fileMenu.addSeparator() action = self.fileMenu.addAction("Switch layout direction") action.triggered.connect(self.switchLayoutDirection) self.fileMenu.addAction(self.exitAct) self.windowMenu = self.menuBar().addMenu("&Window") self.updateWindowMenu() self.windowMenu.aboutToShow.connect(self.updateWindowMenu) self.menuBar().addSeparator() def createStatusBar(self): self.statusBar().showMessage("Ready") def activeMdiChild(self): activeSubWindow = self.mdiArea.activeSubWindow() if activeSubWindow: return activeSubWindow.widget() return None def findMdiChild(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def switchLayoutDirection(self): if self.layoutDirection() == Qt.LeftToRight: QApplication.setLayoutDirection(Qt.RightToLeft) else: QApplication.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window)