上一篇内容我们使用PyQt5搭建了一个简易的GUI应用框架(图形界面编程技巧,用Python中PyQt5库快速创建一个应用程序框架),如果对于处理小的图形界面问题,这样的框架是足够了。但是,对于更复杂的GUI框架,仅仅知道这样的搭建还是远远不够的。
今天,我们来详细了解一下PyQt5中窗体的类型,然后,我们使用QMainWindow主窗体来搭建一个更加复杂的应用程序界面。
窗体有哪些?
简单来讲,PyQt5给我们提供了三种类型的窗体及控件(这里的简单可以理解为日常使用,应该还有更复杂的控件,我这里没有深究):即QMainWindow、QDialog、QWidget控件(准确来讲是类)。
如果是创建一个主窗口,就使用QMainWindow类;
如果创建的是对话框,就使用QDialog类;
如果不确定,或者有可能作为顶层窗口,也有可能嵌入到其他窗口中,那么就使用QWidget类。
区别在哪
它们都是用来创建窗口的,可以直接使用,也可以继承后再使用。但它们的区别在于:
QMainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件,QMainWindow窗口可以包含菜单栏、工具栏、状态栏、标题栏等,是常见的窗口形式,也可以说是GUI程序的主窗口。
QDialog是对话框窗口的基类,对话框主要用来执行短期任务,或者与用户进行互动,它是可以模态的,也是可以非模态的。QDialog窗口没有菜单栏、工具栏、状态栏等控件。
QWidget类是所有用户对象界面控件的基类,所有窗口或控件都直接或者间接继承了QWidget类。一般情况下,我们将没有嵌入到其它控件的控件称为窗口,也叫顶层窗体(如tkinter中的toplevel)。QWidget类是QMainWindow类的父类。QMainWindow继承了QWidget的方法,但它定义的窗体对象更加精确、全面。
一个完整的主窗体
从上面的分析我们知道,QMainWindow就是定义了一个完整的主窗体对象。我们以一个画图板程序为例,来看下图。
一个QMainWindow应该包含的内容有:菜单栏、工具栏、主工作区、状态栏,对于窗口,可以最大化、最小化、关闭这样的按钮应该也是需要的。
QMainWindow接口
QMainWindow提供的接口中常用的有下面几个:
addToolBar:添加工具栏
centralWidget:返回窗口中心的一个控件,未设置时返回NULL
menuBar:返回主窗口的菜单栏
setCentralWidget:设置窗口中心的控件
setStatusBar:设置状态栏
statusBar:获取状态栏对象后,通过调用状态栏对象的showMessage(message int timeout=0)设置状态栏显示信息。第一个参数message是状态栏显示内容,第二个参数timeout表示显示延迟时间,毫秒为单位,设置为0时默认一直显示。
如何创建
我们如何创建一个居中位置的主窗体呢?不赘述,直接上代码。
#!/usr/bin/env python
# coding:utf-8
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDesktopWidget
from PyQt5.QtGui import QIcon
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle('PyQt MainWindow示例')
self.resize(400, 200)
self.center()
def center(self):
# 获取屏幕大小
screen = QDesktopWidget().screenGeometry()
# 获取窗体大小
size = self.geometry()
# 窗体居中
self.move((screen.width() - size.width()) // 2,
(screen.height() - size.height()) // 2)
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setWindowIcon(QIcon('icon.png'))
form = MainWindow()
form.show()
sys.exit(app.exec_())
上面的代码只是创建了一个简单的窗体,如下图所示
可否创建一个更加复杂的窗体呢?
复杂一点的
通过上面分析我们知道,完整一点的窗体应该包括标题栏、菜单栏、工具栏、主要工作区域、状态栏这样一些内容。我们试着将这些内容全部添加到一个类中,创建一个完整的QMainWindow类。这样,我们以后创建窗体时,将这个类添加到PyCharm的live template中,这样就节省了我们不少时间呢!如果我们需要实现下面图示这样一个框架呢?
这个问题该怎么解决,留给小伙伴们下去自己去研究,下一篇内容我们会附上源代码。并使用上述源代码制作一个PyCharm的live template模板用以简化我们以后的输入。也就是说,以后我们搭建上面这样的界面,只需要输入几个(由你定)英文字母。是不是很酷?喜欢这个项目的小伙伴关注我……
今天的内容就到这里了,喜欢的小伙伴点个赞呗,欢迎大家留言讨论……
转载请注明出处,百家号:Python高手养成