创建与使用菜单
获取菜单栏对象,并在菜单栏对象下创建标签,在标签下创建子标签。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Menu(QMainWindow):
def __init__(self):
super(Menu, self).__init__()
# 获取菜单栏
bar = self.menuBar()
# 在菜单栏下创建一个标签“文件”
file = bar.addMenu("文件")
# 在文件标签下增加一个“新建”子标签
file.addAction("新建")
# 创建一个QAction对象
save = QAction("保存", self)
# 设置快捷键
save.setShortcut("Ctrl + S")
# 将QAction对象加入“文件”标签中,成为它的一个子标签
file.addAction(save)
save.triggered.connect(self.process)
# 创建新的标签“Edit”
edit = bar.addMenu("Edit")
edit.addAction("copy")
edit.addAction("paste")
# 创建退出子标签并加入“文件”标签中
quit = QAction("退出", self)
file.addAction(quit)
def process(self):
# 打印触发信号的那个控件的名字
print(self.sender().text())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Menu()
main.show()
sys.exit(app.exec_())
运行效果:
![55be2429e8669a2d3be5cc38c7b0d20a.png](https://i-blog.csdnimg.cn/blog_migrate/f098e2a1b5901d4984fc5088a257018a.png)
所以,我们得到了创建菜单栏的步骤:
- 通过
self.menuBar()
获取菜单栏对象。 - 通过菜单栏对象的
addMenu()
方法往菜单栏中增加标签。 - 往标签对象中增加子标签有两种方法:
- 直接使用标签对象的
addAction()
方法创建。 - 先创建
QAction()
对象,代表一个子标签,再以该对象为参数使用标签对象的addAction()
方法,将创建好的子标签加入标签中。需要注意的是创建QAction
对象时,需要填入self
参数,否则,即便使用addAction
传入后也不会再主菜单中显示。
- 直接使用标签对象的
创建和使用工具栏
往主窗口添加工具栏。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ToolBar(QMainWindow):
def __init__(self):
super(QMainWindow, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("工具栏例子")
self.resize(300, 200)
tb1 = self.addToolBar("File")
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ToolBar()
main.show()
sys.exit(app.exec_())
运行效果:
![4fb0eb432b2103c35b43804d801ed3a6.png](https://i-blog.csdnimg.cn/blog_migrate/16c70481dcbd49e99bdfb464837d90a5.png)
可以看到,主窗口上侧多了一道横线
下面尝试往这个空无一物的工具栏上增加工具
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ToolBar(QMainWindow):
def __init__(self):
super(QMainWindow, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("工具栏例子")
self.resize(300, 200)
# 创建一个工具栏,名为File
tb1 = self.addToolBar("File")
# 往工具栏中添加一个名为set,并且设置了图标对的QAction对象作为工具选项
new = QAction(QIcon('./image/set.ico'), "set", self)
tb1.addAction(new)
refresh = QAction(QIcon('./image/refresh.ico'), "refresh", self)
tb1.addAction(refresh)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ToolBar()
main.show()
sys.exit(app.exec_())
运行效果:
![4cc2f85cf27a3a60013b5693b2c963ff.png](https://i-blog.csdnimg.cn/blog_migrate/ec96135a81323014522c4d29c5e576f6.png)
可以发现,工具栏默认是不显示程序中设置的QAction
对象的文本内容的,我们起的名字,在工具栏中只会以悬停提示的方式展示
那么如何在工具栏上既显示文本,又显示图标呢?只要使用工具栏对象的setToolButtonStyle()
方法(顾名思义,是用来设置按钮展示风格的方法)就行了。参数还是Qt
下的常量。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ToolBar(QMainWindow):
def __init__(self):
super(QMainWindow, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("工具栏例子")
self.resize(500, 400)
# 创建一个工具栏,名为File
tb1 = self.addToolBar("File")
# 往工具栏中添加一个名为set,并且设置了图标对的QAction对象作为工具选项
new = QAction(QIcon('./image/set.ico'), "set", self)
tb1.addAction(new)
refresh = QAction(QIcon('./image/refresh.ico'), "refresh", self)
tb1.addAction(refresh)
print = QAction(QIcon('./image/print.ico'), "print", self)
tb1.addAction(print)
# 设置按钮展示风格:文本在图标旁边
tb1.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ToolBar()
main.show()
sys.exit(app.exec_())
运行效果:
![a5d7ce54780bf09c7780ec45c6e5116e.png](https://i-blog.csdnimg.cn/blog_migrate/b4391e62942a1dfee1626b5cdafbc131.png)
像Qt.ToolButtonTextUnderIcon
这样的设置风格的常量有以下几个:
Qt.ToolButtonIconOnly
:只显示图标,也是默认的风格展示形式。Qt.ToolButtonTextOnly
:只显示文本。Qt.ToolButtonTextUnderIcon
:文本和图标都显示,文本显示在图标的下面。Qt.ToolButtonTextBesideIcon
:文本和图标都显示,文本显示在图标的右侧。Qt.ToolButtonFollowStyle
:好像没有发生什么改变,效果和默认情况一样。
但是我们发现这只按钮风格的效果施加在了所有的工具栏选项上。那么怎样才能做到,对每一个工具栏选项分别施加我们所需要的按钮风格效果呢?我们可以通过创建多个工具栏来实现。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ToolBar(QMainWindow):
def __init__(self):
super(QMainWindow, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("工具栏例子")
self.resize(300, 200)
# 创建一个工具栏,名为File
tb1 = self.addToolBar("File")
# 往工具栏中添加一个名为set,并且设置了图标对的QAction对象作为工具选项
set = QAction(QIcon('./image/set.ico'), "set", self)
tb1.addAction(set)
refresh = QAction(QIcon('./image/refresh.ico'), "refresh", self)
tb1.addAction(refresh)
print = QAction(QIcon('./image/print.ico'), "print", self)
tb1.addAction(print)
tb2 = self.addToolBar("File1")
set1 = QAction(QIcon('./image/set.ico'), "set1", self)
tb2.addAction(set1)
tb2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ToolBar()
main.show()
sys.exit(app.exec_())
运行效果:
![bf5a9558e1c64e3992c945952d2604b1.png](https://i-blog.csdnimg.cn/blog_migrate/bb3988fec10ba84715cfcabb2b27315f.png)
最后,我们来为按钮添加动作:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ToolBar(QMainWindow):
def __init__(self):
super(QMainWindow, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("工具栏例子")
self.resize(300, 200)
# 创建一个工具栏,名为File
tb1 = self.addToolBar("File")
# 往工具栏中添加一个名为set,并且设置了图标对的QAction对象作为工具选项
set = QAction(QIcon('./image/set.ico'), "set", self)
tb1.addAction(set)
refresh = QAction(QIcon('./image/refresh.ico'), "refresh", self)
tb1.addAction(refresh)
print = QAction(QIcon('./image/print.ico'), "print", self)
tb1.addAction(print)
tb2 = self.addToolBar("File1")
set1 = QAction(QIcon('./image/set.ico'), "set1", self)
tb2.addAction(set1)
tb2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
tb1.actionTriggered.connect(self.toolbtnpressed)
tb2.actionTriggered.connect(self.toolbtnpressed)
def toolbtnpressed(self, a):
print("按下的按钮名称为{}".format(a.text()))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ToolBar()
main.show()
sys.exit(app.exec_())
运行效果:
![1f374aa6ba7343f1fdc4ae62d3ea95f9.png](https://i-blog.csdnimg.cn/blog_migrate/122c0d8ab7db80052f9e1df2571c52ec.png)
创建和使用状态栏
状态栏一般是UI的左下角显示状态的一栏。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class StatusBar(QMainWindow):
def __init__(self):
super(StatusBar, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("状态栏演示")
self.resize(300, 200)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("show")
file.triggered.connect(self.processTrigger)
# 在主窗口的中心设置一个QTextEdit控件
self.setCentralWidget(QTextEdit())
# 获取状态栏
self.statusBar = QStatusBar()
self.setStatusBar(self.statusBar)
def processTrigger(self, q):
if q.text() == "show":
self.statusBar.showMessage(q.text() + "菜单被点击了", 5000)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = StatusBar()
main.show()
sys.exit(app.exec_())
运行效果:
![b50dcdcdfb7aa7c94bd675a8a798d69d.png](https://i-blog.csdnimg.cn/blog_migrate/3b1ed2471fba215f98d81cb81c6acd04.png)
点击“show”会在左下角显示一个存在5秒的提示