PyQt5 第二章 窗口布局管理(三) - 日理万妓 2023-01-10 13:26 99阅读 0赞 ## 2.3 菜单和工具栏 ## 这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。 ## 《[零基础入门玩转 PyQt5][PyQt5]》 邀请码: LWskm3AS ## ### 2.3.1 状态栏 ### 状态栏是用来显示应用的状态信息的组件,状态栏是由QMainWindow创建的 **程序展示** 本例中,创建一个状态栏 import sys from PyQt5.QtWidgets import QMainWindow, QApplication class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.statusBar().showMessage("正常!") self.setGeometry(300, 300, 250, 150) self.setWindowTitle('状态栏') self.show() if __name__ == '__main__': app = QApplication(sys.argv) x = Example() sys.exit(app.exec_()) 程序预览: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center] **代码解释** `statusBar()`:创建状态栏,`showMessage()`:在状态栏上显示一条信息 self.statusBar().showMessage('Ready') ### 2.3.2 菜单栏 ### **程序展示** 本例中,创建只有一个命令的菜单栏,这个命令就是终止应用。同时也创建了一个状态栏。而且还能使用快捷键`Ctrl+Q`退出应用 import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp from PyQt5.QtGui import QIcon class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): qact = QAction(QIcon('icon.jpg'), 'exit', self) qact.setShortcut("ctrl+q") qact.setStatusTip('退出') qact.triggered.connect(qApp.quit) menu = self.menuBar() filemenu = menu.addMenu("file") filemenu.addAction(qact) self.statusBar() self.setGeometry(300, 300, 300, 200) self.setWindowTitle('菜单栏') self.show() if __name__ == '__main__': app = QApplication(sys.argv) e = Example() sys.exit(app.exec_()) 程序预览: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 1] **代码解释** `QAction`是菜单栏、工具栏或者快捷键的动作的组合 创建一个图标、一个exit的标签和一个快捷键组合,都执行了一个动作,**注意:ctrl+q之间不可以有空格** qact = QAction(QIcon('icon.jpg'), 'exit', self) qact.setShortcut("ctrl+q") 创建状态栏,当鼠标悬停在菜单栏的时候,能显示当前状态 qact.setStatusTip('退出') 当执行`exit或ctrl+q`动作时,就触发了`QApplication`的`quit()`事件,终止应用 qact.triggered.connect(qApp.quit) `menuBar()`:创建菜单栏。这里创建了一个菜单栏,并用`addMenu()`在上面添加了一个file菜单,用`addAction()`关联了点击退出应用的事件 menu = self.menuBar() filemenu = menu.addMenu("file") filemenu.addAction(qact) ### 2.3.3 子菜单 ### 子菜单是嵌套在菜单里面的二级或者三级菜单 **程序展示** 本例中,有两个子菜单,一个在File菜单下面,一个在File的Import下面 import sys from PyQt5.QtWidgets import QMainWindow, QAction, QApplication, QMenu class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建菜单栏,添加file菜单 menu = self.menuBar() filemenu = menu.addMenu('file') # 添加New子菜单 newact = QAction('new', filemenu) filemenu.addAction(newact) # 添加email子菜单 emailmenu = QMenu('email', filemenu) emailmenu.addAction(QAction('163@mail', self)) emailmenu.addAction(QAction('qq@mail', self)) filemenu.addMenu(emailmenu) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('子菜单') self.show() if __name__ == '__main__': app = QApplication(sys.argv) e = Example() sys.exit(app.exec_()) 程序预览: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 2] **代码解释** 创建一级菜单 menu = self.menuBar() filemenu = menu.addMenu('file') 创建名为new的二级菜单 newact = QAction('new', filemenu) filemenu.addAction(newact) 使用`QMenu`创建一个email菜单,父级是filemenu emailmenu = QMenu('email', filemenu) 使用`addAction()`添加动作,创建两个三级菜单 emailmenu.addAction(QAction('163@mail', self)) emailmenu.addAction(QAction('qq@mail', self)) 将emailmenu添加为二级菜单 filemenu.addMenu(emailmenu) ### 2.3.4 勾选菜单 ### **程序展示** 本例中,创建一个勾选菜单,这个行为/动作能切换状态栏显示或者隐藏 import sys from PyQt5.QtWidgets import QMainWindow, QAction, QApplication class Example(QMainWindow): def __init__(self): super().__init__() self.sbar = self.statusBar() self.initUI() def initUI(self): self.sbar.showMessage('Ready Go') menu = self.menuBar() filemenu = menu.addMenu('file') qact = QAction('open', filemenu, checkable=True) qact.setStatusTip('open file') qact.setChecked(True) qact.triggered.connect(self.status) filemenu.addAction(qact) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('勾选菜单') self.show() def status(self, s): if s: self.sbar.showMessage('checked') else: self.sbar.showMessage('unchecked') if __name__ == '__main__': app = QApplication(sys.argv) e = Example() sys.exit(app.exec_()) 程序预览: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 3] 用`checkable`选项创建一个可勾选的菜单 qact = QAction('open', filemenu, checkable=True) 设置默认为选中状态 qact.setChecked(True) 绑定事件,勾选菜单时触发 qact.triggered.connect(self.status) 回调函数,勾选菜单时触发,s的值为False或True def status(self, s): if s: self.sbar.showMessage('checked') else: self.sbar.showMessage('unchecked') ### 2.3.5 右键菜单 ### 右键菜单也叫弹出框,是在某些场合下显示的一组命令 **程序展示** 本例中,创建右键菜单 import sys from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication, QAction class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Context menu') self.show() def contextMenuEvent(self, event): cmenu = QMenu() newact = cmenu.addAction('new') openact = cmenu.addAction('open') quitact = cmenu.addAction('quit') act = cmenu.exec_(self.mapToGlobal(event.pos())) if quitact == act: qApp.quit() # 效果一样 # def contextMenuEvent(self, event): # cmenu = QMenu() # # cmenu.addAction('new') # cmenu.addAction('open') # # qact = QAction('quit', cmenu) # qact.triggered.connect(qApp.quit) # cmenu.addAction(qact) # # cmenu.exec_(self.mapToGlobal(event.pos())) if __name__ == '__main__': app = QApplication(sys.argv) e = Example() sys.exit(app.exec_()) 程序预览: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 4] **代码解释** 使用`exec_()`方法显示菜单,从鼠标右键事件对象中获得当前坐标。`mapToGlobal()`方法把当前组件的相对坐标转换为窗口的绝对坐标 action = cmenu.exec_(self.mapToGlobal(event.pos())) 如果右键菜单里点击了quit,就触发了退出事件 if action == quitAct: qApp.quit() ### 2.3.6 工具栏 ### **程序展示** 本例中,我们创建一个工具栏,并绑定退出应用的动作 import sys from PyQt5.QtWidgets import QAction, QApplication, QMainWindow, qApp from PyQt5.QtGui import QIcon class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): qtool = QAction(QIcon('icon.jpg'), 'exit', self) qtool.setShortcut('ctrl+q') qtool.triggered.connect(qApp.quit) toolbar = self.addToolBar('exit') toolbar.addAction(qtool) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Toolbar') self.show() if __name__ == '__main__': app = QApplication(sys.argv) e = Example() sys.exit(app.exec_()) 程序预览: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 5] **代码解释** 用`addToolBar()`创建工具栏对象,并用`addAction()`将动作对象添加到工具栏 toolbar = self.addToolBar('Exit') toolbar.addAction(exitAct) ### 2.3.7 主窗口 ### `主窗口就是状态栏、工具栏和菜单栏的总称,QMainWindow`提供了主窗口的功能,使用它就能创建状态栏、工具栏和菜单栏 **程序展示** 本例中,创建一个很经典的菜单框架,有右键菜单,工具栏和状态栏 import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QTextEdit from PyQt5.QtGui import QIcon class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 菜单栏 menu = self.menuBar() filemenu = menu.addMenu('file') # 工具栏 toolbar = self.addToolBar('exit') # 退出动作 quitact = QAction(QIcon('icon.jpg'), 'exit', self) quitact.setShortcut('ctrl+q') quitact.triggered.connect(self.close) # 添加动作 filemenu.addAction(quitact) toolbar.addAction(quitact) # 状态栏 self.statusBar().showMessage('ready go') # 文本编辑区 text = QTextEdit() self.setCentralWidget(text) self.setGeometry(300, 300, 350, 250) self.setWindowTitle('主窗口') self.show() if __name__ == '__main__': app = QApplication(sys.argv) e = Example() sys.exit(app.exec_()) 程序预览: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 6] **代码解释** 创建文本编辑区域,并把它放在`QMainWindow`的中间区域,这个组件会占满所有剩余的区域 textEdit = QTextEdit() self.setCentralWidget(textEdit) [目录][Link 1] [下一篇 事件和信号(一)][Link 2] [PyQt5]: https://www.lanqiao.cn/courses/3841 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center]: /images/20221119/b26fd344465e49d685940773d85ac6ed.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 1]: /images/20221119/a47b5d556d2542818145a656e4cf47b7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 2]: /images/20221119/24df76a4465f46c7b14ea07fd9bf8e00.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 3]: /images/20221119/ab79420169c54a79aa4e57f1a32bb8da.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 4]: /images/20221119/70824e93ae77421e92399894379b0fb7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 5]: /images/20221119/19f1eda9c7bd4890a854529019ddbe5b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg_size_16_color_FFFFFF_t_70_pic_center 6]: https://img-blog.csdnimg.cn/20210124151052708.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pseTcxNzIxNg==,size_16,color_FFFFFF,t_70#pic_center [Link 1]: https://blog.csdn.net/zly717216/article/details/113332916 [Link 2]: https://blog.csdn.net/zly717216/article/details/113107712
还没有评论,来说两句吧...