菜单栏

创建单层菜单

import sys
from PyQt5.QtWidgets import QApplication, QAction, QMainWindow class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI() def initUI(self):
self.statusBar().showMessage("状态栏:无")
self.setWindowTitle("单层菜单栏")
self.setMinimumSize(160, 160)
self.resize(360, 280)
self.createActions()
self.createMenus() def createActions(self):
self.newAct = QAction("新建", self)
self.newAct.setShortcut("Ctrl+N")
self.newAct.setStatusTip("状态栏:新建")
self.newAct.triggered.connect(self.new) self.openAct = QAction("打开", self)
self.openAct.setShortcut("Ctrl+O")
self.openAct.setStatusTip("状态栏:打开")
self.openAct.triggered.connect(self.openf) self.exitAct = QAction("退出", self)
self.exitAct.setShortcut("Ctrl+E")
self.exitAct.setStatusTip("状态栏:退出")
self.exitAct.triggered.connect(self.close) def createMenus(self):
fileMenu = self.menuBar().addMenu("文件 (&F)")
fileMenu.addAction(self.newAct)
fileMenu.addAction(self.openAct)
fileMenu.addSeparator()
fileMenu.addAction(self.exitAct) def new(self):
pass def openf(self):
pass if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())

代码分析:

11行:创建一个状态栏,并显示消息

self.statusBar().showMessage("状态栏:无")

12行:设置应用的标题

self.setWindowTitle("单层菜单栏")

13行:设置窗口能缩小的最小值

self.setMinimumSize(160, 160)

14行:设置窗口的默认大小

self.resize(360, 280)

19行:创建一个动作

self.newAct = QAction("新建", self)

20行:为该动作设置快捷键

self.newAct.setShortcut("Ctrl+N")

21行:为该动作设置状态栏显示的信息

self.newAct.setStatusTip("状态栏:新建")

22行:为该动作的triggered信号绑定槽 (self.new)

self.newAct.triggered.connect(self.new)

32行:这里的槽直接使用就好,不用自己再创建,因为有这个方法了;self.close = QMainWindow.close()

self.exitAct.triggered.connect(self.close)

35行:为主窗口创建一个菜单栏,并添加一个名为文件的菜单;(&F)表示可以使用快捷键Alt+F来快速选择它

fileMenu = self.menuBar().addMenu("文件 (&F)")

36行:为菜单添加一个动作 (self.newAct),改动作已在19行创建并设置好了。

fileMenu.addAction(self.newAct)

38行:添加一个分隔符

fileMenu.addSeparator()

创建多层菜单

import sys
from PyQt5.QtWidgets import QApplication, QAction, QMainWindow
from PyQt5.QtGui import QKeySequence class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI() def initUI(self):
self.statusBar().showMessage("状态栏:无")
self.setWindowTitle("单层菜单栏")
self.setMinimumSize(160, 160)
self.resize(360, 280)
self.createActions()
self.createMenus() def createActions(self):
self.newAct = QAction("新建", self)
self.newAct.setShortcut("Ctrl+N")
self.newAct.setStatusTip("状态栏:新建")
self.newAct.triggered.connect(self.new) self.openAct = QAction("打开", self)
self.openAct.setShortcut("Ctrl+O")
self.openAct.setStatusTip("状态栏:打开")
self.openAct.triggered.connect(self.openf) self.exitAct = QAction("退出", self)
self.exitAct.setShortcut("Ctrl+E")
self.exitAct.setStatusTip("状态栏:退出")
self.exitAct.triggered.connect(self.close) self.setAct = QAction("设置", self)
self.setAct.setStatusTip("状态栏:设置") def createMenus(self):
fileMenu = self.menuBar().addMenu("文件 (&F)")
fileMenu.addAction(self.newAct)
fileMenu.addAction(self.openAct)
moreMenu = fileMenu.addMenu("更多... (&M)") # 在菜单中添加一个菜单
moreMenu.addAction(self.setAct) # 位子菜单添加动作
fileMenu.addSeparator()
fileMenu.addAction(self.exitAct) def new(self):
pass def openf(self):
pass if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())

只是添加了几条代码,已经注释,也可以看 创建单层菜单

如果要创建更多层菜单,只需要向菜单中添加菜单即可

例如:

Amenu = self.menuBar().addMenu("父菜单")
Bmenu = Amenu.addMenu("第一层")
Cmenu = Bmenu.addMenu("第二层")

右键打开菜单

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI() def initUI(self):
self.cutAct = QAction("&Cut", self)
self.copyAct = QAction("&Copy", self)
self.pasteAct = QAction("&Paste", self) def contextMenuEvent(self, event):
menu = QMenu(self)
menu.addAction(self.cutAct)
menu.addAction(self.copyAct)
menu.addAction(self.pasteAct)
menu.exec(event.globalPos()) if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())

官方菜单实例

源码是C++语言的。研究了半天,还好长得差不多,Python算是写出来了。

官方菜单示例:https://doc.qt.io/qt-5/qtwidgets-mainwindows-menus-example.html# (了解更多就看看这个吧)

官方示例源码:https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/mainwindows/menus/mainwindow.cpp?h=5.13

import sys
from PyQt5.QtWidgets import QMessageBox, QActionGroup, QVBoxLayout, QFrame, QLabel, QSizePolicy, QApplication, QMenu, QMenuBar, QMainWindow, QWidget, QAction
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeySequence, QFont class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI() def initUI(self):
widget = QWidget(self)
self.setCentralWidget(widget) self.topFiller = QWidget(self)
self.topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.infolabel = QLabel("<i>Choose a menu option, or right-click to invoke a context menu</i>")
self.infolabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
self.infolabel.setAlignment(Qt.AlignCenter) self.bottomFiller = QWidget(self)
self.bottomFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.layout = QVBoxLayout(self)
self.layout.setContentsMargins(5, 5, 5, 5)
self.layout.addWidget(self.topFiller)
self.layout.addWidget(self.infolabel)
self.layout.addWidget(self.bottomFiller)
widget.setLayout(self.layout) self.createActions()
self.createMenus() self.statusBar().showMessage("A context menu is available by right-clicking") self.setWindowTitle("Menu")
self.setMinimumSize(160, 160)
self.resize(480, 320) def contextMenuEvent(self, event):
menu = QMenu(self)
menu.addAction(self.cutAct)
menu.addAction(self.copyAct)
menu.addAction(self.pasteAct)
menu.exec(event.globalPos()) def createActions(self):
self.newAct = QAction("&New", self)
self.newAct.setShortcuts(QKeySequence.New)
self.newAct.setStatusTip("Create a new file")
self.newAct.triggered.connect(self.newFile) self.openAct = QAction("&Opem", self)
self.openAct.setShortcuts(QKeySequence.Open)
self.openAct.setStatusTip("Open an existing file")
self.openAct.triggered.connect(self.opens) self.saveAct = QAction("&Save", self)
self.saveAct.setShortcuts(QKeySequence.Save)
self.saveAct.setStatusTip("")
self.saveAct.triggered.connect(self.save) self.printsAct = QAction("&Print", self)
self.printsAct.setShortcuts(QKeySequence.Print)
self.printsAct.setStatusTip("Print the document")
self.printsAct.triggered.connect(self.prints) self.exitAct = QAction("&Exit", self)
self.exitAct.setShortcuts(QKeySequence.Quit)
self.exitAct.setStatusTip("Exit the application")
self.exitAct.triggered.connect(self.close) self.undoAct = QAction("&Undo", self)
self.undoAct.setShortcuts(QKeySequence.Undo)
self.undoAct.setStatusTip("Undo the last operation")
self.undoAct.triggered.connect(self.undo) self.redoAct = QAction("&Redo", self)
self.redoAct.setShortcuts(QKeySequence.Redo)
self.redoAct.setStatusTip("Redo the last operation")
self.redoAct.triggered.connect(self.redo) self.cutAct = QAction("&Cut", self)
self.cutAct.setShortcuts(QKeySequence.Cut)
self.cutAct.setStatusTip("Cut the current selection's contents to the clipboard")
self.cutAct.triggered.connect(self.cut) self.copyAct = QAction("&Copy", self)
self.copyAct.setShortcuts(QKeySequence.Copy)
self.copyAct.setStatusTip("Copy the current selection's contents to the clipboard")
self.copyAct.triggered.connect(self.copy) self.pasteAct = QAction("&Paste", self)
self.pasteAct.setShortcuts(QKeySequence.Paste)
self.pasteAct.setStatusTip("Paste the clipboard's contents into the current selection")
self.pasteAct.triggered.connect(self.paste) self.boldAct = QAction("&Bold", self)
self.boldAct.setShortcuts(QKeySequence.Bold)
self.boldAct.setStatusTip("Make the text bold")
self.boldAct.triggered.connect(self.bold)
self.boldFont = QFont()
self.boldFont.setBold(True)
self.boldAct.setFont(self.boldFont) self.italicAct = QAction("&Italic", self)
self.italicAct.setCheckable(True)
self.italicAct.setShortcut(QKeySequence.Italic)
self.italicAct.setStatusTip("Make the text italic")
self.italicAct.triggered.connect(self.italic)
self.italicFont = QFont()
self.italicFont.setItalic(True)
self.italicAct.setFont(self.italicFont) self.setLineSpacingAct = QAction("Set &Line Spacing...", self)
self.setLineSpacingAct.setStatusTip("Change the gap between the lines of a paragraph")
self.setLineSpacingAct.triggered.connect(self.setParagraphSpacing) self.setParagraphSpacingAct = QAction("Set &Paragraph Spacing...", self)
self.setParagraphSpacingAct.setStatusTip("Change the gap between paragraphs")
self.setParagraphSpacingAct.triggered.connect(self.setParagraphSpacing) self.aboutAct = QAction("&About", self)
self.aboutAct.setStatusTip("Show the application's About box")
self.aboutAct.triggered.connect(self.about) self.aboutQtAct = QAction("About &Qt", self)
self.aboutQtAct.setStatusTip("Show the Qt library's About box")
self.aboutQtAct.triggered.connect(QApplication.aboutQt)
self.aboutQtAct.triggered.connect(self.aboutQt) self.leftAlignAct = QAction("&Left Align", self)
self.leftAlignAct.setCheckable(True)
self.leftAlignAct.setShortcut("Ctrl+L")
self.leftAlignAct.setStatusTip("Left align the selected tetx")
self.leftAlignAct.triggered.connect(self.leftAlign) self.rightAlignAct = QAction("&Right Align", self)
self.rightAlignAct.setCheckable(True)
self.rightAlignAct.setShortcut("Ctrl+R")
self.rightAlignAct.setStatusTip("Right algin the selected text")
self.rightAlignAct.triggered.connect(self.rightAlign) self.justifyAct = QAction("&Justify", self)
self.justifyAct.setCheckable(True)
self.justifyAct.setShortcut("Ctrl+J")
self.justifyAct.setStatusTip("Justify the selected text")
self.justifyAct.triggered.connect(self.justify) self.centerAct = QAction("&Center", self)
self.centerAct.setCheckable(True)
self.centerAct.setShortcut("Ctrl+E")
self.centerAct.setStatusTip("Center the selected text")
self.centerAct.triggered.connect(self.center) self.alignmentGroup = QActionGroup(self)
self.alignmentGroup.addAction(self.leftAlignAct)
self.alignmentGroup.addAction(self.rightAlignAct)
self.alignmentGroup.addAction(self.justifyAct)
self.alignmentGroup.addAction(self.centerAct)
self.leftAlignAct.setChecked(True) def createMenus(self): fileMenu = self.menuBar().addMenu("&File")
fileMenu.addAction(self.newAct)
fileMenu.addAction(self.openAct)
fileMenu.addAction(self.saveAct)
fileMenu.addAction(self.printsAct)
fileMenu.addSeparator()
fileMenu.addAction(self.exitAct) editMenu = self.menuBar().addMenu("&Edit")
editMenu.addAction(self.undoAct)
editMenu.addAction(self.redoAct)
editMenu.addSeparator()
editMenu.addAction(self.cutAct)
editMenu.addAction(self.copyAct)
editMenu.addAction(self.pasteAct)
editMenu.addSeparator() helpMenu = self.menuBar().addMenu("&Help")
helpMenu.addAction(self.aboutAct)
helpMenu.addAction(self.aboutQtAct) formatMenu = editMenu.addMenu("&Help")
formatMenu.addAction(self.boldAct)
formatMenu.addAction(self.italicAct)
formatMenu.addSeparator().setText("Alignment")
formatMenu.addAction(self.leftAlignAct)
formatMenu.addAction(self.rightAlignAct)
formatMenu.addAction(self.justifyAct)
formatMenu.addAction(self.centerAct)
formatMenu.addSeparator()
formatMenu.addAction(self.setLineSpacingAct)
formatMenu.addAction(self.setParagraphSpacingAct) def newFile(self):
self.infolabel.setText("Invoked <b>File|New</b>") def opens(self):
self.infolabel.setText("Invoked <b>File|Open</b>") def save(self):
self.infolabel.setText("Invoked <b>File|Save</b>") def prints(self):
self.infolabel.setText("Invoked <b>File|Print</b>") def undo(self):
self.infolabel.setText("Invoked <b>Edit|Undo</b>") def redo(self):
self.infolabel.setText("Invoked <b>Edit|Redo</b>") def cut(self):
self.infolabel.setText("Invoked <b>Edit|Cut</b>") def copy(self):
self.infolabel.setText("Invoked <b>Edit|Copy</b>") def paste(self):
self.infolabel.setText("Invoked <b>Edit|Paste</b>") def bold(self):
self.infolabel.setText("Invoked <b>Edit|Format|Bold</b>") def italic(self):
self.infolabel.setText("Invoked <b>Edit|Format|Italic</b>") def leftAlign(self):
self.infolabel.setText("Invoked <b>Edit|Format|Left Align</b>") def rightAlign(self):
self.infolabel.setText("Invoked <b>Edit|Format|Right Align</b>") def justify(self):
self.infolabel.setText("Invoked <b>Edit|Format|Justify</b>") def center(self):
self.infolabel.setText("Invoked <b>Edit|Format|Center</b>") def setLineSpacing(self):
self.infolabel.setText("Invoked <b>Edit|Format|Set Line Spacing</b>") def setParagraphSpacing(self):
self.infolabel.setText("Invoked <b>Edit|Format|Set Paragraph Spacing</b>") def about(self):
self.infolabel.setText("Invoked <b>Help|About</b>")
QMessageBox.information(self, "About Menu", "The <b>Menu</b> example shows how to create menu-bar menus and context menus.") def aboutQt(self):
self.infolabel.setText("Invoked <b>Help|About Qt</b>") if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())

菜单常用方法

方法 案例 描述
QMenu().setIcon() QMenu().setIcon(QIcon("D:\\.cookie.png")) 为菜单设置一个图标,默认预留一个空位
QMenu().setSeparatorsCollapsible() QMenu().setSeparatorsCollapsible(False) 是否将多个连续的分隔符合并为一个;True表示合并,False表示不合并,默认为True
QMenu().setTearOffEnabled() QMenu.setTearOffEnabled(True) 菜单能否被撕下(移动,变成独立的小窗口),True可以撕下,False不可以,默认为False
QMenu().setTitle() QMenu().setTitle("文件 (&F)") 设置菜单的标题
QMenu().aboutToShow() QMenu().aboutToShow.connect(self.func) 将该信号绑定到一个槽;当你点击菜单后显示出来就会发送此信号(不常用)
QMenu().aboutToHide() QMenu().aboutToHide.connect(self.func) 将该信号绑定到一个槽;当你的菜单隐藏后就会发送此信号(不常用)
QMenu().hovered() QMenu().hovered.connect(self.func) 将该信号绑定到一个槽;当你的鼠标滑过或悬停在菜单时就会发送此信号(不建议用)
QMenu().triggered() QMenu().triggered.connect(self.func) 将该信号绑定到一个槽;当你点击了菜单下的动作(QAction)时会发送此信号(注意:菜单下的菜单不会被触发)
QMenu().addSeparator() QMenu().addSeparator() 为菜单添加分隔符
QMenu().setShortcut() QMenu().setShortcut("Ctrl+A") 设置快捷键
QMenu().clear() QMenu().clear() 清除菜单

PyQt5笔记之菜单栏的更多相关文章

  1. 三、PyQt5不同方法创建菜单栏、工具栏和状态栏

    创建菜单栏.工具栏和状态栏可以直接通过代码实现,也可以通过Qt Designer中的属性编辑器等实现.通过两种方法的学习可以加深理解,更好的掌握PyQt5. 一.菜单栏与状态栏 状态栏的设置比较简单, ...

  2. PyQt5 笔记(02):嵌套布局

    如前一篇笔记,我们还是只讨论两层嵌套布局的情况. 前面的布局有一个缺点:有三个内层布局,则需要三个空部件.那若有十个内层布局呢?显然会让人不舒服. 刚才在玩 Qt Designer 时,发现了一个更好 ...

  3. PyQt5笔记

    PyQt5 窗口类继承QMainWindow. 1.消息盒子QMessageBox 弹出一个窗口,根据选择的不同执行不同的操作.比如点击关闭后,实用消息盒子确认是否关闭. # 关闭QWidget将产生 ...

  4. PyQt5 笔记

    一.简介 pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法.这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS.pyqt5是 ...

  5. pyqt5 笔记(三)py2exe 实现代码打包exe

    python3.4 安装64位的版本 py2exe 下载地址: https://pypi.python.org/pypi/py2exe/0.9.2.0#downloads cmd——>进入pyf ...

  6. pyqt5 笔记(二)实现http请求发送

    上个图~ index.py 文件 # -*- coding: utf-8 -*- from PyQt5 import QtWidgets,QtCore #从pyqt库导入QtWindget通用窗口类 ...

  7. PyQt5 笔记(05):信号/槽

    PyQt 的很多类都内置了信号和槽.下图是 Qt 官方文档对 QThread 类中包含的信号/槽的描述: 一.信号/槽 都是内置的 请看一个最简单的程序: 按钮点击后,窗口关闭 代码: class T ...

  8. PyQt5 笔记(04):主窗口卡死问题

    本文基于:windows 7 + python 3.4 知识点: 1. 将 time.sleep 替换为 QTimer 2. 将 time.sleep 放入到 QThread 3. 使用 QThrea ...

  9. PyQt5 笔记(03):弹出窗口大全

    本文实现了PyQt5个各种弹出窗口:输入框.消息框.文件对话框.颜色对话框.字体对话框.自定义对话框 其中,为了实现自定义对话框的返回值,使用了信号/槽 本文基于 windows 7 + python ...

随机推荐

  1. 执行http脚本

    Invoke-Expression (Invoke-WebRequest http://10.16.2.5:81/Configcmd.ps1).content

  2. PHP 日历函数手册

    PHP日历函数安装>>> 函数名称 描述 cal_days_in_month 返回某个历法中某年中某月的天数 cal_from_jd 转换Julian Day计数到一个支持的历法. ...

  3. E203译码模块(3)

    下面的代码译码出指令的立即数,不同的指令有不同的立即数编码形式. //I类型指令的imm,[31:20],符号位扩展成32位. wire [31:0] rv32_i_imm = { {20{rv32_ ...

  4. 技能篇丨FineCMS 5.0.10 多个漏洞详细分析

    今天是一篇关于技能提升的文章,文章中的CMS是FineCMS,版本是5.0.10版本的几个漏洞分析,主要内容是介绍漏洞修补前和修补后的分析过程,帮助大家快速掌握该技能. 注:篇幅较长,阅读用时约7分钟 ...

  5. SSH开发模式——Struts2进阶

    在之前我有写过关于struts2框架的博客,好像是写了三篇,但是之前写的内容仅仅是struts2的一些基础知识而已,struts2还有很多有趣的内容等待着我们去发掘.我准备再写几篇关于struts2的 ...

  6. 【web后端开发】笔试题收集

    4399Web后端开发笔试题 题目来源:牛客网 1.linux中,用mkdir命令创建新的目录时,如果需要在其父目录不存在时先创建父目录的选项是   D A  -h B -d C  -f D -p [ ...

  7. SQL注入:盲注

    盲注简介 所谓的盲注就是在服务器没有错误回显的时候完成的注入攻击. 服务器没有错误回显,对于攻击者来说缺少了非常重要的"调试信息". 盲注分类 1.布尔盲注 布尔很明显Ture和F ...

  8. liteos软件定时器(十)

    1 概述 1.1 基本概念 软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数.定时精度与系统Tick时钟的周期有关. 硬件定时器受 ...

  9. WAF的部署方式——有直路部署和旁路部署

    随着电子商务.网上银行.电子政务的盛行,WEB服务器承载的业务价值越来越高,WEB服务器所面临的安全威胁也随之增大,因此,针对WEB应用层的防御成为必然趋势,WAF(WebApplicationFir ...

  10. ssh登录缓慢,输入账户密码等待时间长

    vim /etc/ssh/sshd_config #取消ssh的反向dns解析 UseDNS no #关闭ssh的gssapi认证 GSSAPIAuthentication no #排查是否日志文件过 ...