PyQt5不同方法创建菜单栏工具栏和状态栏
Posted chuanxiaopang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5不同方法创建菜单栏工具栏和状态栏相关的知识,希望对你有一定的参考价值。
创建菜单栏、工具栏和状态栏可以直接通过代码实现,也可以通过Qt Designer中的属性编辑器等实现。通过两种方法的学习可以加深理解,更好的掌握PyQt5。
一、菜单栏与状态栏
状态栏的设置比较简单,在设置菜单栏的同时,就可以实现状态栏显示的设置。
1.1 下拉菜单与子菜单
菜单栏位于窗体标题栏的下方,通过QMenu类可添加菜单栏的小控件,创建上下文菜单和弹出菜单。每个Qmenu对象都可以包含QAction对象。单击QAction按钮时,QMenu对象就会发射triggered信号实现功能需求。在举例说明之前,我们先了解下部分重要的方法。
menuBar() | 返回窗口的QMenu对象 |
addMenu() | 在菜单栏里添加一个新的Qmenu对象 |
addAction() | 向QMenu小空间中添加一个操作按钮,其中包含文本或图形 |
addSeperator() | 设置按钮的状态(禁用/启用) |
setShortcut() | 设置快捷键 |
setTitle() | 设置菜单项的文本 |
setText | 设置控件的标题 |
text() | 返回QAction对象关联的文本 |
title() | 返回QMenu控件的标题 |
setStatusTip() | 设置状态栏信息文本 |
下面是案例代码
1 import sys 2 from PyQt5.QtWidgets import * 3 from PyQt5.QtGui import QIcon 4 5 class MyWindow(QMainWindow): 6 7 def __init__(self): 8 super().__init__() 9 self.initUI() 10 11 def initUI(self): 12 self.setGeometry(300,300,500,400) 13 self.setWindowTitle(‘菜单栏例子‘) 14 self.setWindowIcon(QIcon(‘chuan.ico‘)) 15 16 menubar = self.menuBar() 17 file = menubar.addMenu(‘文件‘) 18 """设置一级菜单打开按钮, 这个操作按钮是QAction对象""" 19 open1 = QAction(QIcon(‘open.png‘),‘打开‘,self) #为打开按钮设置图标,显示文本 20 open1.setShortcut(‘ctrl+o‘) #设置快捷键 21 open1.setStatusTip(‘这是打开按钮‘) #设置状态栏信息 22 file.addAction(open1) #添加打开按钮 23 24 """设置编辑按钮,这个操作按钮是字符串""" 25 edit=file.addMenu(‘编辑‘) 26 edit.addAction(‘复制‘) #设置二级菜单复制 27 edit.addAction(‘粘贴‘) #设置二级菜单粘贴 28 29 """另一种方法设置二级菜单""" 30 save = QMenu(‘保存‘) 31 al_save = QAction(‘另存为‘,self) 32 save.addAction(al_save) 33 file.addMenu(save) 34 35 36 """设置退出按钮""" 37 quit_menubar = QAction(QIcon(‘close.ico‘),‘退出‘,self) 38 quit_menubar.setShortcut(‘ctrl+q‘) 39 quit_menubar.setStatusTip(‘这是退出‘) 40 file.addAction(quit_menubar) 41 quit_menubar.triggered.connect(qApp.quit) 42 43 self.statusBar() #初始化状态栏 44 self.center_show() 45 46 47 def center_show(self): 48 qr = self.frameGeometry() 49 cp = QDesktopWidget().availableGeometry().center() 50 qr.moveCenter(cp) 51 self.move(qr.topLeft()) 52 53 54 if __name__ == "__main__": 55 app = QApplication(sys.argv) 56 win = MyWindow() 57 win.show() 58 sys.exit(app.exec_())
菜单中的操作按钮可以是字符串或QAction对象。在上面的例子中,“打开”和“退出”按钮都是QAction对象,而“编辑”按钮则是字符串对象。
还有一点需要注意,一定要加上self.statusBar()将其实例化,否则无法显示状态栏信息。这一命令的位置可以任意放在设置各菜单按钮的状态栏信息的前面或后面。
通过Qt Designer则可以很快实现上述过程。
首先,在属性编辑器里,可以实现对窗体大小,标题,图标以及窗体状态栏的设置。但是在对下拉菜单时不能直接添加图片的(窗体也不能直接添加图片),需要在PyQt开发目录下添加qrc文件。方法如下:
(1)点击右下角资源浏览器,新建一个qrc文件,并设置前缀为pic,然后添加图片资源
(2)在窗体左上角输入菜单项“文件”。
(3)在动作编辑器中新建下拉菜单动作,并添加图片、快捷键,状态栏信息等
(4)将编辑好的动作拖到菜单项中,就可以完成操作。
3.2 勾选菜单
1 import sys 2 from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication,QDesktopWidget 3 from PyQt5.QtGui import QIcon 4 5 6 class MyWindow(QMainWindow): 7 def __init__(self): 8 super().__init__() 9 self.initUI() 10 11 def initUI(self): 12 self.setGeometry(300, 300, 500, 400) 13 self.setWindowTitle(‘勾选菜单示例‘) 14 self.setWindowIcon(QIcon(‘chuan.ico‘)) 15 self.center_show() 16 17 self.statusbar = self.statusBar() 18 19 menubar = self.menuBar() 20 file = menubar.addMenu(‘文件‘) 21 22 sel_menubar = QAction(‘确认‘,self,checkable=True) #checkable=True设置为可勾选 23 sel_menubar.setStatusTip(‘已勾选菜单按钮‘) 24 sel_menubar.setShortcut(‘ctrl+l‘) 25 sel_menubar.setChecked(True) #默认为已勾选 26 file.addAction(sel_menubar) 27 28 sel_menubar.triggered.connect(self.toggleMenu) 29 30 def toggleMenu(self, state): 31 if state: 32 self.statusbar.show() 33 else: 34 self.statusbar.hide() 35 36 def center_show(self): 37 qr = self.frameGeometry() #获得主窗口大小 38 cp = QDesktopWidget().availableGeometry().center() #获取显示器分辨率,并找到中间点 39 qr.moveCenter(cp) #将窗口中点放在屏幕中间 40 self.move(qr.topLeft()) 41 42 43 if __name__ == ‘__main__‘: 44 app = QApplication(sys.argv) 45 win = MyWindow() 46 win.show() 47 sys.exit(app.exec_())
QAction不仅可以实现图片的插入,还可以通过checkable=True/False设置按钮是否可勾选。setChecked(True)可以设置勾选菜单初始化是否勾选。本例中还添加了toggleMenu()方法,实现了勾选与否时,状态栏信息的显示不同。
如何使用Qt Designer创建勾选菜单不再赘述,仿照上例使用动作编辑器即可。
3.3 右键菜单
1 import sys 2 from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication 3 from PyQt5.QtGui import QIcon 4 5 class MyWindow(QMainWindow): 6 def __init__(self): 7 super().__init__() 8 self.initUI() 9 10 def initUI(self): 11 12 self.setGeometry(300, 300, 500, 400) 13 self.setWindowTitle(‘Context menu‘) 14 self.setWindowIcon(QIcon(‘chuan.ico‘)) 15 16 def contextMenuEvent(self, event): 17 18 cmenu = QMenu(self) 19 20 newAct = cmenu.addAction("新建") 21 opnAct = cmenu.addAction("打开") 22 quitAct = cmenu.addAction("退出") 23 action = cmenu.exec_(self.mapToGlobal(event.pos())) 24 25 if action == quitAct: 26 qApp.quit() 27 28 29 if __name__ == ‘__main__‘: 30 app = QApplication(sys.argv) 31 win = MyWindow() 32 win.show() 33 sys.exit(app.exec_())
这里使用contextMenuEvent()方法实现菜单创建。使用exec_()方法显示菜单。从鼠标右键事件对象中获得当前坐标。maptoGlobal()方法把当前组件的相对坐标转换为窗口的绝对坐标。
二、工具栏
工具栏的添加与菜单栏类似,无须赘述。不过注意一点,工具栏添加后只显示图标,不会显示文本。这一点和我们常用的软件一样。
1 import sys 2 from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication 3 from PyQt5.QtGui import QIcon 4 5 class MyWindow(QMainWindow): 6 def __init__(self): 7 super().__init__() 8 self.initUI() 9 10 def initUI(self): 11 self.setGeometry(300, 300, 300, 200) 12 self.setWindowTitle(‘工具栏‘) 13 self.setWindowIcon(QIcon(‘chuan.ico‘)) 14 15 exitAct = QAction(QIcon(‘close.ico‘), ‘退出‘, self) 16 exitAct.setShortcut(‘Ctrl+Q‘) 17 exitAct.triggered.connect(qApp.quit) 18 19 self.toolbar = self.addToolBar(‘退出‘) 20 self.toolbar.addAction(exitAct) 21 22 23 if __name__ == ‘__main__‘: 24 app = QApplication(sys.argv) 25 win = MyWindow() 26 win.show() 27 sys.exit(app.exec_())
使用Qt Designer添加工具栏的方法同样和添加菜单类似。只是首先在窗体是单击右键,选择添加工具栏,然后就可以通过动作编辑器添加动作,通过属性编辑器设置图标
以上是关于PyQt5不同方法创建菜单栏工具栏和状态栏的主要内容,如果未能解决你的问题,请参考以下文章
PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏
PyQt5 学习记录005:QMainWindow 及状态栏菜单栏和工具栏