PyQt5 第二章 窗口布局管理(三)

- 日理万妓 2023-01-10 13:26 209阅读 0赞

2.3 菜单和工具栏

这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。

《零基础入门玩转 PyQt5》 邀请码: LWskm3AS

2.3.1 状态栏

状态栏是用来显示应用的状态信息的组件,状态栏是由QMainWindow创建的

程序展示

本例中,创建一个状态栏

  1. import sys
  2. from PyQt5.QtWidgets import QMainWindow, QApplication
  3. class Example(QMainWindow):
  4. def __init__(self):
  5. super().__init__()
  6. self.initUI()
  7. def initUI(self):
  8. self.statusBar().showMessage("正常!")
  9. self.setGeometry(300, 300, 250, 150)
  10. self.setWindowTitle('状态栏')
  11. self.show()
  12. if __name__ == '__main__':
  13. app = QApplication(sys.argv)
  14. x = Example()
  15. sys.exit(app.exec_())

程序预览:
在这里插入图片描述

代码解释

statusBar():创建状态栏,showMessage():在状态栏上显示一条信息

  1. self.statusBar().showMessage('Ready')

2.3.2 菜单栏

程序展示

本例中,创建只有一个命令的菜单栏,这个命令就是终止应用。同时也创建了一个状态栏。而且还能使用快捷键Ctrl+Q退出应用

  1. import sys
  2. from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp
  3. from PyQt5.QtGui import QIcon
  4. class Example(QMainWindow):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. qact = QAction(QIcon('icon.jpg'), 'exit', self)
  10. qact.setShortcut("ctrl+q")
  11. qact.setStatusTip('退出')
  12. qact.triggered.connect(qApp.quit)
  13. menu = self.menuBar()
  14. filemenu = menu.addMenu("file")
  15. filemenu.addAction(qact)
  16. self.statusBar()
  17. self.setGeometry(300, 300, 300, 200)
  18. self.setWindowTitle('菜单栏')
  19. self.show()
  20. if __name__ == '__main__':
  21. app = QApplication(sys.argv)
  22. e = Example()
  23. sys.exit(app.exec_())

程序预览:
在这里插入图片描述

代码解释

QAction是菜单栏、工具栏或者快捷键的动作的组合

创建一个图标、一个exit的标签和一个快捷键组合,都执行了一个动作,注意:ctrl+q之间不可以有空格

  1. qact = QAction(QIcon('icon.jpg'), 'exit', self)
  2. qact.setShortcut("ctrl+q")

创建状态栏,当鼠标悬停在菜单栏的时候,能显示当前状态

  1. qact.setStatusTip('退出')

当执行exit或ctrl+q动作时,就触发了QApplicationquit()事件,终止应用

  1. qact.triggered.connect(qApp.quit)

menuBar():创建菜单栏。这里创建了一个菜单栏,并用addMenu()在上面添加了一个file菜单,用addAction()关联了点击退出应用的事件

  1. menu = self.menuBar()
  2. filemenu = menu.addMenu("file")
  3. filemenu.addAction(qact)

2.3.3 子菜单

子菜单是嵌套在菜单里面的二级或者三级菜单

程序展示

本例中,有两个子菜单,一个在File菜单下面,一个在File的Import下面

  1. import sys
  2. from PyQt5.QtWidgets import QMainWindow, QAction, QApplication, QMenu
  3. class Example(QMainWindow):
  4. def __init__(self):
  5. super().__init__()
  6. self.initUI()
  7. def initUI(self):
  8. # 创建菜单栏,添加file菜单
  9. menu = self.menuBar()
  10. filemenu = menu.addMenu('file')
  11. # 添加New子菜单
  12. newact = QAction('new', filemenu)
  13. filemenu.addAction(newact)
  14. # 添加email子菜单
  15. emailmenu = QMenu('email', filemenu)
  16. emailmenu.addAction(QAction('163@mail', self))
  17. emailmenu.addAction(QAction('qq@mail', self))
  18. filemenu.addMenu(emailmenu)
  19. self.setGeometry(300, 300, 300, 200)
  20. self.setWindowTitle('子菜单')
  21. self.show()
  22. if __name__ == '__main__':
  23. app = QApplication(sys.argv)
  24. e = Example()
  25. sys.exit(app.exec_())

程序预览:
在这里插入图片描述

代码解释

创建一级菜单

  1. menu = self.menuBar()
  2. filemenu = menu.addMenu('file')

创建名为new的二级菜单

  1. newact = QAction('new', filemenu)
  2. filemenu.addAction(newact)

使用QMenu创建一个email菜单,父级是filemenu

  1. emailmenu = QMenu('email', filemenu)

使用addAction()添加动作,创建两个三级菜单

  1. emailmenu.addAction(QAction('163@mail', self))
  2. emailmenu.addAction(QAction('qq@mail', self))

将emailmenu添加为二级菜单

  1. filemenu.addMenu(emailmenu)

2.3.4 勾选菜单

程序展示

本例中,创建一个勾选菜单,这个行为/动作能切换状态栏显示或者隐藏

  1. import sys
  2. from PyQt5.QtWidgets import QMainWindow, QAction, QApplication
  3. class Example(QMainWindow):
  4. def __init__(self):
  5. super().__init__()
  6. self.sbar = self.statusBar()
  7. self.initUI()
  8. def initUI(self):
  9. self.sbar.showMessage('Ready Go')
  10. menu = self.menuBar()
  11. filemenu = menu.addMenu('file')
  12. qact = QAction('open', filemenu, checkable=True)
  13. qact.setStatusTip('open file')
  14. qact.setChecked(True)
  15. qact.triggered.connect(self.status)
  16. filemenu.addAction(qact)
  17. self.setGeometry(300, 300, 300, 200)
  18. self.setWindowTitle('勾选菜单')
  19. self.show()
  20. def status(self, s):
  21. if s:
  22. self.sbar.showMessage('checked')
  23. else:
  24. self.sbar.showMessage('unchecked')
  25. if __name__ == '__main__':
  26. app = QApplication(sys.argv)
  27. e = Example()
  28. sys.exit(app.exec_())

程序预览:

在这里插入图片描述

checkable选项创建一个可勾选的菜单

  1. qact = QAction('open', filemenu, checkable=True)

设置默认为选中状态

  1. qact.setChecked(True)

绑定事件,勾选菜单时触发

  1. qact.triggered.connect(self.status)

回调函数,勾选菜单时触发,s的值为False或True

  1. def status(self, s):
  2. if s:
  3. self.sbar.showMessage('checked')
  4. else:
  5. self.sbar.showMessage('unchecked')

2.3.5 右键菜单

右键菜单也叫弹出框,是在某些场合下显示的一组命令

程序展示

本例中,创建右键菜单

  1. import sys
  2. from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication, QAction
  3. class Example(QMainWindow):
  4. def __init__(self):
  5. super().__init__()
  6. self.initUI()
  7. def initUI(self):
  8. self.setGeometry(300, 300, 300, 200)
  9. self.setWindowTitle('Context menu')
  10. self.show()
  11. def contextMenuEvent(self, event):
  12. cmenu = QMenu()
  13. newact = cmenu.addAction('new')
  14. openact = cmenu.addAction('open')
  15. quitact = cmenu.addAction('quit')
  16. act = cmenu.exec_(self.mapToGlobal(event.pos()))
  17. if quitact == act:
  18. qApp.quit()
  19. # 效果一样
  20. # def contextMenuEvent(self, event):
  21. # cmenu = QMenu()
  22. #
  23. # cmenu.addAction('new')
  24. # cmenu.addAction('open')
  25. #
  26. # qact = QAction('quit', cmenu)
  27. # qact.triggered.connect(qApp.quit)
  28. # cmenu.addAction(qact)
  29. #
  30. # cmenu.exec_(self.mapToGlobal(event.pos()))
  31. if __name__ == '__main__':
  32. app = QApplication(sys.argv)
  33. e = Example()
  34. sys.exit(app.exec_())

程序预览:
在这里插入图片描述

代码解释

使用exec_()方法显示菜单,从鼠标右键事件对象中获得当前坐标。mapToGlobal()方法把当前组件的相对坐标转换为窗口的绝对坐标

  1. action = cmenu.exec_(self.mapToGlobal(event.pos()))

如果右键菜单里点击了quit,就触发了退出事件

  1. if action == quitAct:
  2. qApp.quit()

2.3.6 工具栏

程序展示

本例中,我们创建一个工具栏,并绑定退出应用的动作

  1. import sys
  2. from PyQt5.QtWidgets import QAction, QApplication, QMainWindow, qApp
  3. from PyQt5.QtGui import QIcon
  4. class Example(QMainWindow):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. qtool = QAction(QIcon('icon.jpg'), 'exit', self)
  10. qtool.setShortcut('ctrl+q')
  11. qtool.triggered.connect(qApp.quit)
  12. toolbar = self.addToolBar('exit')
  13. toolbar.addAction(qtool)
  14. self.setGeometry(300, 300, 300, 200)
  15. self.setWindowTitle('Toolbar')
  16. self.show()
  17. if __name__ == '__main__':
  18. app = QApplication(sys.argv)
  19. e = Example()
  20. sys.exit(app.exec_())

程序预览:

在这里插入图片描述

代码解释

addToolBar()创建工具栏对象,并用addAction()将动作对象添加到工具栏

  1. toolbar = self.addToolBar('Exit')
  2. toolbar.addAction(exitAct)

2.3.7 主窗口

主窗口就是状态栏、工具栏和菜单栏的总称,QMainWindow提供了主窗口的功能,使用它就能创建状态栏、工具栏和菜单栏

程序展示

本例中,创建一个很经典的菜单框架,有右键菜单,工具栏和状态栏

  1. import sys
  2. from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QTextEdit
  3. from PyQt5.QtGui import QIcon
  4. class Example(QMainWindow):
  5. def __init__(self):
  6. super().__init__()
  7. self.initUI()
  8. def initUI(self):
  9. # 菜单栏
  10. menu = self.menuBar()
  11. filemenu = menu.addMenu('file')
  12. # 工具栏
  13. toolbar = self.addToolBar('exit')
  14. # 退出动作
  15. quitact = QAction(QIcon('icon.jpg'), 'exit', self)
  16. quitact.setShortcut('ctrl+q')
  17. quitact.triggered.connect(self.close)
  18. # 添加动作
  19. filemenu.addAction(quitact)
  20. toolbar.addAction(quitact)
  21. # 状态栏
  22. self.statusBar().showMessage('ready go')
  23. # 文本编辑区
  24. text = QTextEdit()
  25. self.setCentralWidget(text)
  26. self.setGeometry(300, 300, 350, 250)
  27. self.setWindowTitle('主窗口')
  28. self.show()
  29. if __name__ == '__main__':
  30. app = QApplication(sys.argv)
  31. e = Example()
  32. sys.exit(app.exec_())

程序预览:

在这里插入图片描述

代码解释

创建文本编辑区域,并把它放在QMainWindow的中间区域,这个组件会占满所有剩余的区域

  1. textEdit = QTextEdit()
  2. self.setCentralWidget(textEdit)

目录   下一篇 事件和信号(一)

发表评论

表情:
评论列表 (有 0 条评论,209人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PyQt5,第一个窗口

    0.前言 Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架,是目前开发桌面应用程序主流框架。PyQt5是Qt框架的Python绑定

    相关 PyQt5固定窗口大小

    PyQt5固定窗口大小 > 直接以数值固定大小 ![这里写图片描述][70] > 根据屏幕大小固定大小 ![这里写图片描述][70 1] 禁止最大化按钮