本篇文章来源于州的先生在线教程《一看就懂的Python图形界面编程》第4篇,更多精彩教程请访问:https://zmister.com/docs 进行学习。
在上一篇文章《使用PySide2编写一个最基础的图形界面》中,州的先生(zmister.com)介绍了在PySide2/PyQt5中最基础的图形界面的创建方法。在那篇文章中,我们通过一个QtWidgets.MainWindow()类实现了一个空白的图形界面窗口。这篇文章,咱们就和州的先生(zmister.com)一起,来详细了解了解Qt中的MainWindow()控件。
文章目录
一、MainWindow()是什么?
MainWindow()控件是Qt中的一个主窗口框架,其提供了构建应用程序图形用户界面的框架。形象地说,MainWindow()就像是一个房子的最基础结构,房子在毛坯房阶段时候的形态。
我们创建一个继承自MainWindow对象的类,就相当于,嗖的一下,我们在市区的新楼盘里买了一套房。这套房里面什么都没有,干干净净的。Qt这个包,就像是房地产公司,把一个简陋的毛坯房交给我们了,然后房子里面要怎么装修、怎么布局,它都不会管了,完全由我们自己来掌控。
二、MainWindow里面有什么?
上面我们说了,MainWindow()控件就像是一个毛坯房。既然是毛坯房,那么在规划之处,房地产公司肯定会对其有一个基础的户型规划,门、客厅、阳台、卧室、卫生间等等基础结构的位置都已经有基础的标明。
同样的,MainWindow作为一个主窗口的框架,其也有自己的基础布局,我们可以添加菜单栏、工具栏、状态栏、主中央口控件等内容进去。下图是Qt官方对MainWindow控件的布局描述:
也就是说,虽然默认的主窗口是一个一穷二白的图形界面,但是因为其设计之初就预设了一些布局,所以我们可以直接拿来使用。下面我们一一进行示例。
在开始添加之前,我们先来创建一个空白的主窗口,代码如下所示:
# coding:utf-8
# 州的先生
# https://zmister.com
from PySide2 import QtWidgets
import sys
class App(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
def main():
app = QtWidgets.QApplication(sys.argv)
gui = App()
gui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
运行上述代码,我们可以得到和上一篇文章一样的图形界面窗口,如下图所示:
下面,我们就在这个图形界面主窗口中演示添加MainWindow的各种基础控件。
三、在MainWindow中添加菜单栏
要在主窗口中添加菜单栏,我们只需要实例化一个QMenuBar()类,然后向其中添加具体的菜单项即可,代码如下所示:
# coding:utf-8
# 州的先生
# https://zmister.com
from PySide2 import QtWidgets
import sys
class App(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
file_menu = QtWidgets.QMenuBar(self) # 实例化一个菜单栏
file_menu.setFixedWidth(200) # 设置菜单栏的宽度
file_menu.addMenu("文件") # 添加一个菜单按钮
file_menu.addMenu("编辑") # 添加一个菜单按钮
file_menu.addMenu("关于") # 添加一个菜单按钮
def main():
app = QtWidgets.QApplication(sys.argv)
gui = App()
gui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
如代码中的注释所说,我们首先实例化了一个QMenuBar(),然后设置了菜单栏的宽度,最后在菜单栏中添加了三个菜单项,运行上述代码,我们可以得到如下图所示的主窗口:
可以看到,主窗口中就已经出现了菜单栏,并且其中有三个我们添加的菜单项。只不过目前的菜单项都还没有实际的功能,因为我们没有为菜单项绑定具体的行为。
四、在MainWindow中添加工具栏
在MainWindow中添加工具栏,我们不需要像添加菜单栏那样实例化一个对象,MainWindow中已经有一个方法addToolbar()可以直接添加一个工具栏,在添加工具栏之后,再使用addAction()方法,像工具栏中添加工具选项即可,代码如下所示:
# coding:utf-8
# 州的先生
# https://zmister.com
from PySide2 import QtWidgets
import sys
class App(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
view_toolbar = self.addToolBar("View")
view_toolbar.addAction("打开")
view_toolbar.addAction("保存")
view_toolbar.addAction("撤回")
def main():
app = QtWidgets.QApplication(sys.argv)
gui = App()
gui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
运行上述代码,我们将会得到一个如下动图所示的主窗口界面:
同样的,由于没有对行为进行事件响应的绑定,所以现在工具栏也是没有任何实际效果的。
五、在MainWindow中添加状态栏
在主窗口中添加状态栏首先需要返回主窗口的状态栏(将主窗口的状态栏赋值给一个变量),然后在调用状态栏。下面的代码演示了在状态栏中显示一个消息:
# coding:utf-8
# 州的先生
# https://zmister.com
from PySide2 import QtWidgets
import sys
class App(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
status = self.statusBar()
status.showMessage("这是一个状态栏消息")
def main():
app = QtWidgets.QApplication(sys.argv)
gui = App()
gui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
运行上述代码,我们将会在主窗口中的最底部看到一个状态栏,上面显示了一行文本消息,如下图所示:
六、在MainWindow中设置中央控件
主窗口中的中央控件用于显示主窗口的基础控件,每一个主窗口都会有一个中央控件,就算其是一个占位符,也必须存在。中央控件通常来说是一个标准的Qt窗口小控件,比如QWidget、QPushbutton等等。
我们在实例化了一个Qt窗口控件之后,使用self.setCentralWidget()方法指定中央控件即可。
七、最后
上面我们初步介绍了PySide2/PyQt5中的主窗口类MainWindow的一些基础方法和布局,还有更多的方法再此都没有讲解到。但是就像上面所说的,MainWindow就像是一间什么都没有的毛坯房,我们可以在里面进行各种装修、设计和创造。这个装修、设计和创造的过程,就是我们进行图形界面编程的过程。理解了这一概念,我们就能够通过上述几个例子,理解MainWindow对象所承载和能够实现的功能。
有疑问欢迎留言讨论:)
文章版权所有:州的先生博客,转载必须保留出处及原文链接