QMainWindow类提供了一个主应用程序窗口。 这使得能够创建具有状态栏,工具栏和菜单栏的经典应用程序框架。
状态栏控件比较简单,就先从这里开始。
源代码如下 :
# -*- coding: utf-8 -*- from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox from PyQt5.QtGui import QIcon import sys class Example(QMainWindow): def __init__(self): super().__init__() self.InitUI() def InitUI(self): self.statusBar().showMessage('准备就绪') self.setGeometry(300,300,550,300) self.setWindowTitle('我与PyQt5有个约会 --状态栏的实现') self.setWindowIcon(QIcon('myico.ico')) self.show() # 关闭程序窗口 def closeEvent(self, event): reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())执行结果如下:
self.statusBar().showMessage('准备就绪')要获取状态栏,我们调用QWidget.QMainWindow类的statusBar()方法。 该方法的第一个调用创建一个状态栏。 后续调用返回状态栏对象。 showMessage()在状态栏上显示一条消息。
1),创建一个简单的菜单栏。
实现简单的菜单栏的源代码如下 :
# -*- coding: utf-8 -*- from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp from PyQt5.QtGui import QIcon import sys class Example(QMainWindow): def __init__(self): super().__init__() self.InitUI() def InitUI(self): self.statusBar().showMessage('准备就绪') self.setGeometry(300,300,550,300) self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现') self.setWindowIcon(QIcon('myico.ico')) self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self) self.exitQAct.setShortcut('Ctrl+Q') self.exitQAct.setStatusTip('退出程序') self.exitQAct.triggered.connect(qApp.quit) menubar = self.menuBar() fileMenu = menubar.addMenu('文件(&F)') fileMenu.addAction(self.exitQAct) self.show() # 关闭程序窗口 def closeEvent(self, event): reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())在上面的例子中,我们用一个菜单创建一个菜单。 此菜单将包含一个选择时终止应用程序的操作。 还创建状态栏。 该操作可通过Ctrl + Q快捷方式访问。
执行的结果如下:
self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self) self.exitQAct.setShortcut('Ctrl+Q') self.exitQAct.setStatusTip('退出程序')QAction是使用菜单栏,工具栏或自定义键盘快捷方式执行操作的抽象。在上述三行中,我们创建一个具有特定图标和“退出”标签的动作。此外,为此操作定义了快捷方式。当我们将鼠标指针悬停在菜单项上时,第三行创建状态栏显示在状态栏中。
self.exitQAct.triggered.connect(qApp.quit)当我们选择这个特定的动作时,发出触发信号。 信号连接到QApplication小部件的quit()方法。 这终止了应用程序。
menubar = self.menuBar() fileMenu = menubar.addMenu('文件(&F)') fileMenu.addAction(self.exitQAct)menuBar()方法创建一个菜单栏。 我们使用addMenu()创建文件菜单,并使用addAction()添加操作。
上面的代码中我们在退出、文件后面都增加了“&”这个符号,增加这个符号后,当我们按住“Alt+F”的时候就能快速打开文件这个菜单,同理按住“Alt+E”的时候就能退出了。
2), 子菜单
子菜单是另一个菜单中的菜单。类似下图中的样子。
或者 :
子菜单实现的源代码 :
# -*- coding: utf-8 -*- from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp, QMenu from PyQt5.QtGui import QIcon import sys class Example(QMainWindow): def __init__(self): super().__init__() self.InitUI() def InitUI(self): self.statusBar().showMessage('准备就绪') self.setGeometry(300,300,550,300) self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现') self.setWindowIcon(QIcon('myico.ico')) self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self) self.newQAct.setShortcut('Ctrl+N') self.newQAct.setStatusTip('新建文件') self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self) self.exitQAct.setShortcut('Ctrl+Q') self.exitQAct.setStatusTip('退出程序') self.exitQAct.triggered.connect(qApp.quit) saveMenu = QMenu('保存方式(&S)', self) self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self) self.saveQAct.setShortcut('Ctrl+S') self.saveQAct.setStatusTip('保存文件') self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self) self.saveasQAct.setStatusTip('文件另存为') saveMenu.addAction(self.saveQAct) saveMenu.addAction(self.saveasQAct) menubar = self.menuBar() fileMenu = menubar.addMenu('文件(&F)') fileMenu.addAction(self.newQAct) fileMenu.addMenu(saveMenu) fileMenu.addSeparator() fileMenu.addAction(self.exitQAct) self.show() # 关闭程序窗口 def closeEvent(self, event): reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())程序效果如下:
在这个例子中,我们有三个菜单项: 其中两个位于文件菜单中(新建、退出),另一个位于文件的保存子菜单中。
saveMenu = QMenu('保存方式(&S)', self)使用QMenu创建新菜单。
self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self) self.saveQAct.setShortcut('Ctrl+S') self.saveQAct.setStatusTip('保存文件') self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self) self.saveasQAct.setStatusTip('文件另存为') saveMenu.addAction(self.saveQAct) saveMenu.addAction(self.saveasQAct)两个动作使用addAction()被添加到子菜单中。
3), 上下文菜单
Windows操作系统中任何地方右击鼠标会出现俗称的“右键菜单”,其实就是指上下文菜单。
先欣赏一下源代码大餐 :
# -*- coding: utf-8 -*- from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp, QMenu from PyQt5.QtGui import QIcon import sys class Example(QMainWindow): def __init__(self): super().__init__() self.InitUI() def InitUI(self): self.statusBar().showMessage('准备就绪') self.setGeometry(300,300,550,300) self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现') self.setWindowIcon(QIcon('myico.ico')) self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self) self.newQAct.setShortcut('Ctrl+N') self.newQAct.setStatusTip('新建文件') self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self) self.exitQAct.setShortcut('Ctrl+Q') self.exitQAct.setStatusTip('退出程序') self.exitQAct.triggered.connect(qApp.quit) saveMenu = QMenu('保存方式(&S)', self) self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self) self.saveQAct.setShortcut('Ctrl+S') self.saveQAct.setStatusTip('保存文件') self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self) self.saveasQAct.setStatusTip('文件另存为') saveMenu.addAction(self.saveQAct) saveMenu.addAction(self.saveasQAct) menubar = self.menuBar() fileMenu = menubar.addMenu('文件(&F)') fileMenu.addAction(self.newQAct) fileMenu.addMenu(saveMenu) fileMenu.addSeparator() fileMenu.addAction(self.exitQAct) self.show() def contextMenuEvent(self, event): cmenu = QMenu(self) self.newQAct = cmenu.addAction("新建") self.saveQAct = cmenu.addAction("保存") self.exitQAct = cmenu.addAction("退出") action = cmenu.exec_(self.mapToGlobal(event.pos())) if action == self.exitQAct: qApp.quit() # 关闭程序窗口 def closeEvent(self, event): reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())程序执行后,单击右键效果如下 :
要使用上下文菜单,我们必须重新实现contextMenuEvent()方法。
action = cmenu.exec_(self.mapToGlobal(event.pos()))使用exec_()方法显示上下文菜单。 从事件对象获取鼠标指针的坐标。 mapToGlobal()方法将窗口小部件坐标转换为全局屏幕坐标。
if action == self.exitQAct: qApp.quit()如果从上下文菜单返回的操作等于退出操作,我们终止应用程序。
各项命令都是在菜单栏当中,但是我们可以把一些常用的命令放在工具栏上,例如新建、打开、保存等等。
源代码如下:
# -*- coding: utf-8 -*- from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp, QMenu from PyQt5.QtGui import QIcon import sys class Example(QMainWindow): def __init__(self): super().__init__() self.InitUI() def InitUI(self): self.statusBar().showMessage('准备就绪') self.setGeometry(300,300,650,300) self.setWindowTitle('我与PyQt5有个约会 --菜单栏&工具栏的实现') self.setWindowIcon(QIcon('myico.ico')) #------------------------------------------------------------------------- # 菜单栏 #------------------------------------------------------------------------- self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self) self.newQAct.setShortcut('Ctrl+N') self.newQAct.setStatusTip('新建文件') self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self) self.exitQAct.setShortcut('Ctrl+Q') self.exitQAct.setStatusTip('退出程序') self.exitQAct.triggered.connect(qApp.quit) saveMenu = QMenu('保存方式(&S)', self) self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self) self.saveQAct.setShortcut('Ctrl+S') self.saveQAct.setStatusTip('保存文件') self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self) self.saveasQAct.setStatusTip('文件另存为') saveMenu.addAction(self.saveQAct) saveMenu.addAction(self.saveasQAct) menubar = self.menuBar() fileMenu = menubar.addMenu('文件(&F)') fileMenu.addAction(self.newQAct) fileMenu.addMenu(saveMenu) fileMenu.addSeparator() fileMenu.addAction(self.exitQAct) #------------------------------------------------------------------------- # 工具栏 #------------------------------------------------------------------------- toolbar = self.addToolBar('工具栏') toolbar.addAction(self.newQAct) toolbar.addAction(self.saveQAct) toolbar.addAction(self.saveasQAct) toolbar.addAction(self.exitQAct) self.show() def contextMenuEvent(self, event): cmenu = QMenu(self) self.newQAct = cmenu.addAction("新建") self.saveQAct = cmenu.addAction("保存") self.exitQAct = cmenu.addAction("退出") action = cmenu.exec_(self.mapToGlobal(event.pos())) if action == self.exitQAct: qApp.quit() # 关闭程序窗口 def closeEvent(self, event): reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())程序执行效果如下:
#------------------------------------------------------------------------- # 工具栏 #------------------------------------------------------------------------- toolbar = self.addToolBar('工具栏') toolbar.addAction(self.newQAct) toolbar.addAction(self.saveQAct) toolbar.addAction(self.saveasQAct) toolbar.addAction(self.exitQAct)工具栏使用addToolBar()方法创建。 我们使用addAction()向工具栏添加两个动作对象。