对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中的localtime()方法使用详解
May 22 Python
利用python操作SQLite数据库及文件操作详解
Sep 22 Python
python编写简易聊天室实现局域网内聊天功能
Jul 28 Python
python直接获取API传递回来的参数方法
Dec 17 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
Python运行异常管理解决方案
Mar 09 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
python zip()函数的使用示例
Sep 23 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
关于使用js算总价的问题
2017/06/23 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
python在不同层级目录import模块的方法
2016/01/31 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
Python爬取成语接龙类网站
2018/10/19 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
英语系毕业生自荐信
2013/10/31 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
2015中学教学工作总结
2015/07/22 职场文书
公司档案管理制度
2015/08/05 职场文书
小学班主任教育随笔
2015/08/15 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang