在 Qt
中,常用的三种窗体是:QMainWindow
, QWidget
, QDialog
,本文简单介绍一下这三种窗体的区别及 QApplication
的作用。
QApplication
QApplication
是 Qt
框架中的一个类,负责管理应用程序的事件处理等。
一个 QApplication
对象被创建时,将会初始化 Qt
库,并设置一些应用程序的全局属性。例如,应用程序的名称、图标、默认字体等。
在创建 QApplication
对象后,通过调用 exec() 函数启动事件循环。
事件循环负责处理各种事件(如鼠标点击、键盘输入等),并将其发送给相应的窗口部件(即所谓的 Widget
)进行处理。
除了处理事件外,QApplication
还提供其他功能,如国际化支持、命令行参数解析等。
具体的使用方式见下文窗体示例。
QMainWindow
使用 QApplication
建立一个 Qt
应用程序,QMainWindow
建立一个图形界面,并设置窗体的标题为 QMainWindow
,运行后显示窗体如下:
from PySide6.QtWidgets import (QApplication, QMainWindow)
if __name__ == '__main__'
app = QApplication()
mainwindow = QMainWindow()
mainwindow.setWindowTitle("QMainWindow")
mainwindow.show()
app.exec()
这样我们就显示了一个基本的窗体,窗体包含以下几部分:
- 标题栏
- 窗体logo
- 窗体标题(title)
- 窗体控制按钮(最小化、最大化、关闭)
- 主窗体
窗体中什么都没有,我们后续会逐步添加。
QDialog
通过一下代码建立一个 QDialog
窗体,Dialog
中文应该称之为对话框,界面与 QMainWindow 基本类似。
from PySide6.QtWidgets import (QApplication, QDialog)
if __name__ == '__main__':
app = QApplication()
dialog = QDialog()
dialog.setWindowTitle("QDialog")
dialog.show()
app.exec()
QWidget
除了以上两种窗体外,还可以直接使用 QWidget
显示窗体,Widget
意为控件,但也可以直接显示为一个窗体。
from PySide6.QtWidgets import (QApplication, QWidget)
if __name__ == '__main__':
app = QApplication()
widget = QWidget()
widget.setWindowTitle("QWidget")
widget.show()
app.exec()
区别与总结
为什么会有这么多种窗体?
程序上的设计一定有原因,任何程序的设计都要为了使用更方便,而不能为了设计而设计。
观察 QMainWindow
和 QDialog
的源码,我们发现这两个类其实都基于 QWidget
继承而来,而 QWidget
则继承自 QObject
和 QPaintDevice
:
class QMainWindow(PySide6.QtWidgets.QWidget):
...
class QDialog(PySide6.QtWidgets.QWidget):
...
class QWidget(__PySide6_QtCore.QObject, __PySide6_QtGui.QPaintDevice):
...
因此,这三个窗体的关系其实是这样的,QMainWindow
和 QDialog
是基于 QWidget
来设计、添加、修改某些功能实现的,为了不同的使用需求。
比如作为主窗体的 QMainWindow
就添加了顶部的菜单栏和底部的状态栏,可能暂时没有显示,但实际上存在对应的控件。
而作为对话框的 QDialog
,就精简了很多功能,比如不需要最大化和最小化,因为只需要弹出对话框告知用户某些信息,或者让用户点击一个 是 或者 否 等等。
QWidget
可以作为单独的窗体显示,也可以作为控件嵌入到某个窗体、甚至某个控件内部,以设计更复杂的界面。
同理,我们可以基于 QWidget
设计一个我们自己的窗体,比如默认包含一个按钮的窗体等。