对PyQt5中的菜单栏和工具栏实例详解


Posted in Python onJune 20, 2019

在这一部分,我们学习创建状态栏,菜单栏和工具栏。一个菜单是位于菜单栏的一组命令。一个工具栏有一些按钮,这些按钮在应用程序中拥有一些常用命令。状态栏显示状态信息,通常位于应用窗口下方。

QMainWindow

QMainWindow类提供了一个主应用窗口。这允许我们创建一个带有状态栏,工具栏和菜单栏的经典程序框架。

Statusbar(状态栏)

一个状态栏是用于显示状态信息的一个组件。

#!/usr/bin/python3
# -*- coding:utf-8 -*- 

  import sys
  from PyQt5.QtWidgets import QMainWindow, QApplication

  class Example(QMainWindow):

    def __init__(self):
      super().__init__()

      self.initUI()

    def initUI(self):
      self.statusBar().showMessage("Ready")

      self.setGeometry(300,300,250,150)
      self.setWindowTitle("StatusBar")
      self.show()

  if __name__ == '__main__':
    app = QApplication(sys.argv)

    ex = Example()

    sys.exit(app.exec_())

状态栏在QMainWindow组件的帮助下被创建。

self.statusBar().showMessage("Ready")

为了获取状态栏,我们调用类QtGui.QMainWindow的statusBar()方法。该方法的第一个调用创建一个状态栏。子序列调用返回状态栏对象。showMessage()展示在状态栏上的信息。

下面是这个小例子程序的运行结果:

对PyQt5中的菜单栏和工具栏实例详解

简单的菜单

菜单栏是GUI应用程序的通用组件。他是一组位于多个菜单的命令。(Mac OS以不同的方式对待菜单栏。为了获得相似的输出,我们可以添加下列一行:menubar.setNativeMenubar(False)。)

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow,QAction, QApplication, qApp
from PyQt5.QtGui import QIcon

class Example(QMainWindow):
  def __init__(self):
    super().__init__()

    self.initUI()

  def initUI(self):
    exitAct = QAction(QIcon('exit.png'),'&Exit',self)
    exitAct.setShortcut('Ctrl+Q')
    exitAct.setStatusTip("Exit application")
    exitAct.triggered.connect(qApp.quit)

    self.statusBar()

    menubar = self.menuBar()

    fileMenu = menubar.addMenu("&File")
    fileMenu.addAction(exitAct)

    self.setGeometry(300,300,300,200)
    self.setWindowTitle("Simple menu")
    self.show()

if __name__ == '__main__':

  app = QApplication(sys.argv)

  ex = Example()

  sys.exit(app.exec_())

在上面的例子程序中,我们创建了一个带有一个菜单的菜单栏。这个菜单包含一个动作,如果选中的话,将会终止该应用程序。当然,也创建了一个状态栏。这个动作也可以使用Ctrl+Q快捷键。

exitAct = QAction(QIcon("exit.png"),"&Exit",self)
exitAct.setShortcut("Ctrl+Q")
exitAct.setStatusTip("Exit application")

QAction是一个运行在菜单栏,工具栏和定制键盘快捷键的抽象类。在上面三行中,我们使用特定的图标和一个'Exit'标签创建了一个行为。进一步说,一个快捷键为了这个行为被定义。第三行创建了一个状态提示,当鼠标经过该菜单选项的时候,被显示在状态栏上。

exitAct.triggered.connect(qApp.quit)

当我们选中这个特定的行为的时候,一个触发的信号被提交。该信号被连接到QApplication组件的quit()方法。这个会终止这个程序。

menubar = self.menuBar()
fileMenu = menubar.addMenu("&File")
fileMenu.addAction(exitAct)

menuBar()方法创建了一个菜单栏。我们使用addMenu()创建了一个文件按钮,并且使用addAction()方法添加一个行为。

下面是该小例子的截图:

![enter description here][2

子菜单

一个子菜单是位于另外一个菜单中的一个菜单。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication

class Example(QMainWindow):

  def __init__(self):
    super().__init__()

    self.initUI()

  def initUI(self):
    menubar = self.menuBar()
    fileMenu = menubar.addMenu("File")

    impMenu = QMenu("Import",self)
    impAct = QAction("Import mail",self)
    impMenu.addAction(impAct)

    newAct = QAction("New", self)

    fileMenu.addAction(newAct)
    fileMenu.addMenu(impMenu)

    self.setGeometry(300,300,300,200)
    self.setWindowTitle("Submenu")

    self.show()

if __name__ == '__main__':

  app = QApplication(sys.argv)

  ex = Example()

  sys.exit(app.exec_())

在这个例子中,我们有两个菜单选项;一个位于文件菜单中,另一个位于文件的Import子菜单中。

impMenu = QMenu("Import", self)

新的菜单使用QMenu创建。

impAct = QAction("Import mail", self)
impMenu.addAction(impAct)

一个行为通过使用addAction()被添加到子菜单中。

对PyQt5中的菜单栏和工具栏实例详解

选项菜单

在下面的例子中,我们创建了一个按钮可以被选中或者是不被选中。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QAction

class Example(QMainWindow):

  def __init__(self):
    super().__init__()

    self.initUI()

  def initUI(self):

    self.statusbar = self.statusBar()
    self.statusbar.showMessage("Ready")

    menubar = self.menuBar()
    viewMenu = menubar.addMenu("View")

    viewStatAct = QAction("View statusbar",self,checkable=True)
    viewStatAct.setStatusTip("View statusbar")
    viewStatAct.setChecked(True)
    viewStatAct.triggered.connect(self.toggleMenu)

    viewMenu.addAction(viewStatAct)

    self.setGeometry(300,300,300,200)
    self.setWindowTitle("Check menu")
    self.show()

  def toggleMenu(self,state):
    if state:
      self.statusbar.show()
    else:
      self.statusbar.hide()


if __name__ == "__main__":
  app = QApplication(sys.argv)

  ex = Example()

  sys.exit(app.exec_())

这个代码例子创建了带有一个行为的视图菜单。这个行为显示或者是隐藏状态栏。当状态栏可视的时候,菜单选项被选中。

viewStatAct = QAction('View statusbar', self, checkable=True)

使用checkable选项,我们创建了一个可选择菜单。

viewStatAct.setChecked(True)

因为状态栏在一开始的时候是可视的,我们使用setChecked()方法来设置该行为。

def toggleMenu(self, state):
  if state:
    self.statusbar.show()
  else:
    self.statusbar.hide()

依赖于行为选中的状态,我们设置状态栏是否显示。

对PyQt5中的菜单栏和工具栏实例详解

上下文菜单

一个上下文菜单,也被称作弹出菜单,一个出现在一些上下文中的一个命令列表。例如,在一个Opera网页浏览器中,当你在一个网页中右击的时候,我们获得一个上下文菜单。在这里我们可以重新加载一个页面,回退,或者是查看页面源码。如果我们右击一个工具栏,我们将会得到管理工具栏的另一个上下文菜单。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow, qApp,QMenu,QApplication

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(self)

    newAct = cmenu.addAction("New")
    opnAct = cmenu.addAction("Open")
    quitAct = cmenu.addAction("Quit")
    action = cmenu.exec_(self.mapToGlobal(event.pos()))

    if action == quitAct:
      qApp.quit()

if __name__ == '__main__':
  app = QApplication(sys.argv)

  ex = Example()

  sys.exit(app.exec_())

为了能够使用上下文菜单,我们必须重新集成contextMenuEvent()方法。

action = cmenu.exec_(self.mapTpGlobal(event.pos()))

该上下文菜单被exec_()方法显示。他们从事件对象中获得鼠标指针的坐标。mapToGlobal()方法传递组件的坐标到全局的屏幕坐标。

if action == quitAct:
  qApp.quit()

如果从上下文菜单返回的行为等于退出行为,则程序被终止。

工具栏

在一个应用程序中,菜单栏组织了所有的命令。工具栏提供了常用命令的快速访问途径。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp,QApplication
from PyQt5.QtGui import QIcon

class Example(QMainWindow):

  def __init__(self):
    super().__init__()

    self.initUI()

  def initUI(self):

    exitAct = QAction(QIcon("exit.png"),"Exit",self)
    exitAct.setShortcut("Ctrl+Q")
    exitAct.triggered.connect(qApp.quit)

    self.toolbar = self.addToolBar("Exit")
    self.toolbar.addAction(exitAct)

    self.setGeometry(300,300,300,200)
    self.setWindowTitle("Toolbar")
    self.show()


if __name__ == '__main__':
  app = QApplication(sys.argv)

  ex = Example()

  sys.exit(app.exec_())

在上面的例子中,我们创建了一个简单的工具栏。工具栏有一个工具行为,一个退出行为,当触发的时候终止程序。

exitAct = QAction(QIcon("exit.png"),"Exit",self)
    exitAct.setShortcut("Ctrl+Q")
    exitAct.triggered.connect(qApp.quit)

和上面例子中的菜单栏一样,我们创建了一个行为对象。该对象有一个标签,图标和一个快捷方式。Qt.QMainWindow中的一个quit()方法被连接到触发信号中。

self.toolbar = self.addToolBar("Exit")
   self.toolbar.addAction(exitAct)

工具栏被addToolBar()被创建。我们使用addAction()方法添加一个行为对象到工具栏中。

把他们放到一起

在最后一个例子中,我们将会创建一个菜单栏,工具栏和一个状态栏。我们也将会创建一个中心的组件。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction,QApplication
from PyQt5.QtGui import QIcon

class Example(QMainWindow):

  def __init__(self):
    super().__init__()

    self.initUI()

  def initUI(self):

    textEdit = QTextEdit()
    self.setCentralWidget(textEdit)

    exitAct = QAction(QIcon("exit.png"),"Exit",self)
    exitAct.setShortcut("Ctrl+Q")
    exitAct.setStatusTip("Exit application")
    exitAct.triggered.connect(self.close)

    self.statusBar()

    menubar = self.menuBar()
    fileMenu = menubar.addMenu("&File")
    fileMenu.addAction(exitAct)

    toolbar = self.addToolBar("Exit")
    toolbar.addAction(exitAct)

    self.setGeometry(300,300,350,250)
    self.setWindowTitle("Main Window")
    self.show()

if __name__ == "__main__":

  app = QApplication(sys.argv)

  ex = Example()

  sys.exit(app.exec_())

在这里,我们创建了一个文本编辑组件。我们也把它设置成为QMainWindow的中心组件。中心组件被分为剩余空间的所有空间。

本篇章中,我们学习了菜单栏,工具栏和状态栏,还有一个主程序窗口。希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的作用域规则详解
Jan 30 Python
python使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python 转义字符详细介绍
Mar 21 Python
python获取多线程及子线程的返回值
Nov 15 Python
wxpython实现图书管理系统
Mar 12 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
Python3分析处理声音数据的例子
Aug 27 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
PyQt QCombobox设置行高的方法
Jun 20 #Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 #Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 #Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 #Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 #Python
PyQt5笔记之弹出窗口大全
Jun 20 #Python
PyQt5创建一个新窗口的实例
Jun 20 #Python
You might like
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
通过dbi使用perl连接mysql数据库的方法
2014/04/16 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
python两个list[]相加的实现方法
2020/09/23 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
个人求职信范文分享
2014/01/06 职场文书
优质服务活动实施方案
2014/05/02 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
解除劳动合同证明书
2014/09/26 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
公积金接收函格式
2015/01/30 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书