[Python] QT简易使用

工具

本文使用python语言进行的GUI开发,这里使用的模块是QT.py,它可以以统一的API使用不同的GUI工具包,具体介绍可见QT、PyQt、Pyside、QT.py之间的关系和区别

UI组件

这些GUI组件类是Qt库中常用的组件,可以用于创建各种类型的GUI应用程序。

类型 作用
QWidget QWidget是Qt库中所有GUI组件的基类,也可以用于创建窗口
QHBoxLayout 水平布局类,用于在水平方向上排列GUI组件。
QVBoxLayout 垂直布局类,用于在垂直方向上排列GUI组件。
QGroupBox 组框类,用于创建一个带有标题的组框,可以将其他GUI组件放在组框中。
QLabel 标签类,用于显示文本或图像。
QToolButton 工具按钮类,用于创建一个带有图标和文本的按钮。
QPushButton 普通按钮类,用于创建一个带有文本的按钮。
QComboBox 组合框类,用于创建一个下拉列表框,可以选择其中的一个选项。
QProgressBar 进度条类,用于显示进度条。
QSpinBox 微调框类,用于创建一个微调框,允许用户输入整数,或者通过上下按键递增或者递减。
QSlider 滑动条类,用于创建一个滑动条,可以通过滑动条选择一个数字。
QCheckBox 复选框类,用于创建一个复选框,可以选择或取消选择一个选项。
QSizePolicy 大小策略类,用于设置GUI组件的大小策略,例如最小大小、最大大小、扩展大小等。

用法介绍

QApplication

import sys
from Qt import QtWidgets, QtCore


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("simple test")
        self.setGeometry(1800, 100, 385, 672)
        self.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()

    sys.exit(app.exec_())


这里首先定义了一个简单的类,继承了QtWidgets.QMainWindow。然后在其初始化函数中调用父类的初始化,以及自定义的初始化函数initUI()

initUI()中,调用setWindowTitle创建应用程序的标题,setGeometry用于设置窗口的大小位置,四个参数依次为窗口的横坐标,纵坐标,宽,高。调用show让窗口显示。

这里通过Qt.py模块的QtWidgets来创建一个Qt应用。QApplication专为QGuiApplication提供基于QWidget的应用程序所需的一些功能。不管你有多少个窗口,都有且仅有一个QApplication对象来管理它们。

对于基于非QWidget的Qt应用程序,请改用QGuiApplication,因为它不依赖于QtWidgets库。

在创建一个QApplication的实例,需要传入一个参数,一般为sys.argv 或一个空列表[]。这个参数的作用是在应用程序启动时将任何配置设置传递给Qt。

在启动时传递sys.argvQApplication允许你从命令行中定制Qt的行为。如果你不想或者不需要向Qt传递命令行参数,你可以跳过传递sys.argv,使用空列表[]

当你的应用程序启动时,sys.argv包含用于启动应用程序的参数。如果你从命令行启动一个Python应用程序,sys.argv将包含你的Python脚本文件的名字作为第一个条目。而跟在启动程序的命令末尾添加的任何内容都会被附加到sys.argv上。

python test.py --info --test

这样启动程序中获取到的sys.argv就是['test.py','--info','--test']

注意,在命令行中参数是以空格分割的, 所以任何用空格分隔的东西都会被当作一个新的参数。如果要传递包含空格的参数,需要用引号将其包起来。

Qt程序启动的常见参数包括:

  • --platform platformName[:options] 指定Qt平台抽象(QPA)插件。这覆盖了QT_QPA_PLATFORM环境变量。
  • --platformpluginpath path 指定平台插件的路径。这覆盖了QT_QPA_PLATFORM_PLUGIN_PATH环境变量。
  • --platformtheme theme 指定平台的主题。这将覆盖QT_QPA_PLATFORMTHEME环境变量。
  • --qwindowicon icon 设置一个窗口的默认图标。
  • --qwindowgeometry geometry 为主窗口指定一个几何图形,应该像100x100+50+50那样传递。
  • --qwindowtitle title 设置第一个窗口的标题。

上面app.exec_()的作用是运行主循环,必须调用QApplication对象的exec_()exec()才能开始事件处理,调用该方法进入程序的主循环直到调用exit()结束。主事件循环从窗口系统接收事件,并将其分派给应用程序小部件。该方法结束时返回一个状态码。

sys.exit(n)的作用是退出应用程序并返回状态码n到父进程。

Python 3之前,exec是一个保留的关键字,所以Qt开发人员在其中添加了下划线。所以对于Python 3的Qt,两个exec函数是相同的。对于较旧的Qt,只有exec_()可用。

注意 show方法并不是直接让窗口显示,本质上可以将其理解为界定窗口在何时弹出的“声明”,解释器读取到这里,Qt程序还没有启动,只是确定了一旦启动,应该在“这个时候”弹出这个窗口,真正让程序启动的是exec函数。

QGroupBox

self.global_group = QtWidgets.QGroupBox(self)
self.global_group.setGeometry(QtCore.QRect(0, 40, 380, 350))
self.global_group.setTitle("全局")

QGroupBox类提供带有标题的组框框架。一个组框提供一个框架,一个标题,一个快捷键,并在其内部显示其他各种小部件。快捷键用于将键盘焦点移到组框的子窗口小部件之一。

这里通过setGeometry设置组框的大小和位置,调用setTitle设置组框的标题。默认标题位置在左上,也可以通过setAlignment来设置标题对齐方式。

QToolButton

help_button = QtWidgets.QToolButton(self)
help_button.setGeometry(QtCore.QRect(320, 7, 30, 31))
help_button.setIcon(QtGui.QIcon("help.png"))

QAbstractButton类为抽象类,不能实例化,必须由其他的按钮类继承QAbstractButton类,来实现不同的功能和表现形式,常见的按钮QPushButtonQToolButtonQRadioButtonQCheckBox这些按钮均继承自QAbstractButton类。

QToolButton类让我们可以快速地实现命令和选项按钮,它通常用在QToolBar中。相比于普通的命令按钮QPushButton,工具按钮通常不显示文本,只显示图标。

这里通过调用setIcon来设置按钮显示的图标,图标通过QtGui.QIcon类创建。当然,也可以通过setText来设置按钮显示文本。

QLabel

Component_label = QtWidgets.QLabel(self)
Component_label.setGeometry(QtCore.QRect(20, 7, 100, 30))
Component_label.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken)
Component_label.setText("右下对齐")
Component_label.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)

QLabel是QT界面中的标签类,它从QFrame下继承,QLabel类代表标签,它是一个用于显示文本或图像的窗口部件。

QLabel对象的显示内容可以包括纯文本,富文本,图像,动画,数字类型,当使用任何方法改变内容时,任何先前的内容都被清除。你可以通过属性获取或修改内容,主要如下:

text():获取显示的文本
setText():设置纯文本和富文本内容
pixmap():获取显示的图像 
setPixmap(QPixmap pixmap):设置显示的图像
setNum(num):设置显示的文本为代表数字num的字符串
setMovie(QMovie mov):设置显示的动画

注意:当在QLabel中使用setText()设置文本内容的时候,因为QLabel会尝试猜测它是将文本显示为纯文本还是作为HTML 4标记的一部分的富文本。想明确地显示文本格式,请调用setTextFormat(),例如如果您希望文本是纯文本格式,但无法控制文本源(显示从Web上加载的数据时等情况)。

默认情况下,标签显示左对齐、垂直居中的文本和图像。QLabel的外观可以通过多种方式进行调整和微调。

可以使用setFrameStyle来指定标签的样式,上面就指定了一个凹陷面板的样式。

可以使用setAlignment()setIndent()来调整QLabel小部件区域内的对齐方式和缩进值。对于文本内容,还可以使用setwordpwrap()指定沿单词边界换行。

Qt中的组件对齐方式取值如下:

1)Qt.AlignLeft::水平方向靠左。
2)Qt.AlignRight:水平方向靠右。
3)Qt.AlignHCenter:水平方向居中。
4)Qt.AlignJustify:水平方向调整间距两端对齐。
5)Qt.AlignTop:垂直方向靠上。
6)Qt.AlignButton:垂直方向靠下。
7)Qt.AlignVCenter:垂直方向居中。
8)Qt.AlignCenter:等价于 Qt.AlignHCenter | Qt.AlignVCenter。
其中一个水平方向的取值和一个垂直方向的取值可以用 “|” 的方式组合起来以同时指定两个方向的对齐方式。

QSpinBox

newComponent = QtWidgets.QSpinBox(self.global_widget)
newComponent.setMinimum(0)
newComponent.setMaximum(100)
newComponent.setValue(1)


QSpinBox类用于整数的显示和输入,一般显示十进制数,也可以显示二进制、十六进制的数,而且可以在显示框中增加前缀或后缀。

如果要显示浮点数,使用QDoubleSpinBox用于浮点数的显示和输入,可以设置显示小数位数,也可以设置显示的前缀和后缀。

QSpinBoxQDoubleSpinBox都是QAbstractSpinBox的子类,具有大多数相同的属性,只是参数类型不同,通过属性的对应set方法就可以为其设置各项属性的值。

QSpinBox的默认数值范围是0-99,默认每次变化步数1,用户可以通过设置属性自行修改范围和步数。

常用的属性包括:

  • prefix:数字显示的前缀,例如“E”
  • suffix:数字显示的后缀,例如“cm”
  • minimum:数值范围的最小值,如 0
  • maximum:数值范围的最大值,如 255
  • singlestep:单击右侧上下调整按钮时的单步改变值,如设置为 1,或 0.1
  • value:当前显示的值
  • displaylntegerBase:QSpinBox 特有属性,显示整数使用的进制,例如 2 就表示二进制
  • decimals:QDoubleSpinBox 特有属性,显示数值的小数位数,例如 2 就显示两位小数

QComboBox

newComponent = QtWidgets.QComboBox(self.global_widget)
newComponent.addItems(["选项1", "选项2"])
newComponent.addItem("选项3")
newComponent.addItem(QtGui.QIcon("help.png"), "选项4")
newComponent.setCurrentIndex(1)

QComboBox是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个QLineEdit用作输入。QComboBox除了显示可见下拉列表外,每个项(item,或称列表项)还可以关联一个QVariant类型的变量,用于存储一些不可见数据。

通过addItems可以一次性添加列表中的选项作为下拉框的选项。

addItem可以添加一个新的下拉框选项,第一个参数为图标时,添加带图标的项,否则添加不带图标的项。

setCurrentIndex()用于指定当前默认显示的选项序号,注意序号从0开始。

currentlndex()返回当前选择的选项序号,currentText()返回当前选择项的文字,currentData()返回当前选择项关联的数据。

setView(QAbstractItemView)设置QComboBox下拉框的样式,可以是列表、树、表格等格式。

QCheckBox

newComponent = QtWidgets.QCheckBox(self.global_widget)
newComponent.setChecked(False)


newComponent_1 = QtWidgets.QCheckBox(self.global_widget)
newComponent_1.setTristate(True)
newComponent.setCheckState(QtCore.Qt.PartiallyChecked)

QCheckBox 是 Qt 里的复选框控件,一般来说复选框通常用于表示可以启用或禁用的应用程序中的功能。

QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框。

QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮。这是因为它们都可以在开(选中)或者关(未选中)之间切换。区别是对用户选择的限制:单选框定义了“多选一”的选择,而复选框提供的是“多选多”的选择。

只要复选框被选中或者清除,都会发射一个stateChanged()信号。如果想在复选框状态改变的时候触发一个行为,请连接这个信号,可以使用isChecked()来查询复选框是否被选中。

除了常用的选中和未选中两个状态,QCheckBox还可选地提供了第三种状态(半选)。

QCheckBox类中常用方法如下:

setChecked():设置复选框的状态,设置为True表示选中,False表示取消选中的复选框
setText():设置复选框的显示文本
text():返回复选框的显示文本
isChecked():检查复选框是否被选中
setTriState():设置复选框为一个三态复选框
setCheckState():设置三态复选框的状态
CheckState():获取当前三态复选框的状态

三态复选框的三种状态如下:

Qt.Checked:值为2,表示组件没有被选中(默认)
Qt.PartiallyChecked:值为1,表示组件被半选中
Qt.Unchecked:值为0,表示组件被选中

QSlider

newComponent = QtWidgets.QSlider(self.global_widget)
newComponent.setMinimum(1)
newComponent.setMaximum(100)
newComponent.setValue(50)
newComponent.setOrientation(QtCore.Qt.Horizontal)

sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(newComponent.sizePolicy().hasHeightForWidth())
newComponent.setSizePolicy(sizePolicy)

QSlider控件提供一个垂直或者水平的滑动条,滑动条是一个用于控制有界值典型的控件,它允许用户沿水平或者垂直方向在某一范围内移动滑块,并将滑块所在的位置转换为一个合法范围内的整数值。

这种方式比输入数字或者使用QSpinBox(计数器)更加自然,在槽函数中对滑块所在位置的处理相当于从整数之间的最小值和最高值进行取值。

滑块条控件可以以垂直或者水平的方式显示,通过setOrientation来控制显示方向,可选的取值为:

Qt.Horizontal 水平显示
Qt.Vertical   垂直显示

作为一个获取整数输入的控件,它与QSpinBox之间有着不少相似的属性。常见的QSlider类属性设置方法如下:

setMinimum():设置滑动条控件的最小值
setMaximum():设置滑动条控件的最大值
setSingleStep():设置滑动条控件的步长
setValue():设置滑动条控件的值
value():获取滑动条控件的值
setTickInterval():设置刻度间隔
setTickPosition():设置刻度标记的位置,可以输入一个枚举值,这个枚举值指定刻度线想当与滑块和用户操作的位置。

刻度标记位置位置的可选取值以及含义如下:

QSlider.NoTicks:不绘制任何刻度线
QSlider.TicksBothSides:在滑块的两侧绘制刻度线
QSlider.TicksAbove:在滑块的(水平)上方绘制刻度线
QSlider.TicksBelow:在滑块的(水平)下方绘制刻度线
QSlider.TicksLeft:在滑块的(垂直)左侧绘制刻度线
QSlider.TicksRight:在滑块的(垂直)右侧绘制刻度线

QSlider类中的常用信号包括:

valueChanged:当滑块的值发生改变时发射此信号,此信号是最常用的
sliderPressed:当用户按下滑块时发射此信号
sliderMoved:当用户拖动滑块时发射此信号
sliderReleased:当用户释放滑块时发射此信号

QSizePolicy是用于描述水平或垂直布局调整的属性。setHorizontalPolicy()确定水平调整级别,setVerticalPolicy()确定垂直调整级别,也可以创建时一次性设置两个布局策略。

QSizePolicy的大小策略可选取值及含义如下:

这里使用sizePolicy来控制silder的长度和位置,因为在默认情况下,它会紧挨着上个控件的位置开始。

QPushButton

default_para = QtWidgets.QPushButton(self)
default_para.setGeometry(QtCore.QRect(10, 400, 91, 23))
default_para.setText("恢复默认参数")


QPushButton小部件提供了一个命令按钮。按钮或命令按钮可能是任何图形用户界面中最常用的小部件。按下(或者单击)按钮以命令计算机执行某个操作。

一个命令按钮是矩形的,通常显示一个描述其动作的文本标签,还可以选择一个小图标。

显示内容可以使用构造函数在创建时就设置,也稍后使用setText()setIcon()设置和更改。

如果该按钮被禁用,文本和图标的外观与GUI风格相关,以使按钮看起来“禁用”。

当按钮被鼠标,空格键或键盘快捷键激活时,按钮发出clicked()信号。连接到这个信号来执行按钮的动作。按钮也提供其他较少使用的信号,例如pressed()released()

QPushButton类中的常用方法如下:

setCheckable():设置按钮是否已经被选中,如果设置True,则表示按钮将保持已点击和释放状态
toggle():在按钮状态之间进行切换
setIcon():设置按钮上的图标
setEnabled():设置按钮是否可以使用,当设置为False时,按钮变成不可用状态,点击它不会发射信号
isChecked():返回按钮的状态,返回值为True或者False
setDefault():设置按钮的默认状态
setText():设置按钮的显示文本
text():返回按钮的显示文本

通过按钮名字能为QPushButton设置快捷键,比如名字为‘&Download’的按键,它的快捷键是‘Alt+D’。

快捷键规则是;想要实现快捷键为“Alt+D”,那么按钮的名字里需要有D这个字母,并且在D的前面加上“&”。一般来说,我们用首字母设置快捷键,而且在按钮显示时“&”不会显示出来,如果想显示该字符,那么需要转义使用。

QProgressBar

progressBar = QtWidgets.QProgressBar(self)
progressBar.setGeometry(QtCore.QRect(10, 430, 350, 23))
progressBar.setValue(10)
progressBar.setStyleSheet("QProgressBar { border: 2px solid grey; border-radius: 5px; color: rgb(20,20,20);  background-color: #FFFFFF; text-align: center;}QProgressBar::chunk {background-color: rgb(100,200,200); border-radius: 10px; margin: 0.1px;  width: 1px;}")


QProgressBar控件提供了水平或者垂直的进度条,它以动画的形式显示程序的处理进度。 可以通过设置属性来设置进度条的最小值、最大值和当前值显示进度,最小值和最大值默认分别为0和99。

QPushButton类中的常用方法如下:

setRange():设置进度条的取值范围(最小值和最大值)
setMinimum():设置进度条的最小值
setFont():设置文本字体
setMaximum():设置进度条的最大值
setValue():设置进度条的值
reset():让进度条重新回到开始位置
setOrientation():设置进度条方向(水平: Qt.Horizontal, 垂直: Qt.Vertical)
setTextVisible():设置进度条的文本是否可见
setTextDirection():设置文本方向,只对垂直进度条有效
setInvertedAppearance():设置进度条的方向(True/False:正反方向)
setFormat():设置文本字符串的格式(%p, 百分比显示,这是默认情况, %v: 当前进度, %m :总步数)
setStyleSheet():设置进度条的样式,需要一定的样式基础。

QVBoxLayout/QHBoxLayout

self.global_layout = QtWidgets.QVBoxLayout(self.global_widget)
self.global_layout.setContentsMargins(0, 0, 0, 0)

horizontalLayout = QtWidgets.QHBoxLayout()
horizontalLayout.addWidget(Component_label,1)
horizontalLayout.addWidget(Component,1)

self.global_layout.addLayout(horizontalLayout)

QVBoxLayout是Qt中的垂直布局类,用于在垂直方向上排列GUI组件。类似地,有QHBoxLayout类,用于在水平方向上排列GUI组件。

使用布局类能让程序具有更强的适应性,这个才是布局一个应用的更合适的方式。

setContentsMargins设置左、上、右、下的外边距,可以将左、上、右、下的外边距设置为不同的值。

通过调用addWidget可以将QtWidget的组件加入到布局中,第一个参数为要加入的组件,第二个为可选参数,代表显示组件比例。类似地,调用addLayout方法,可以将新的布局添加进当前布局内部。

通过addStretch可以在布局中添加一个可伸缩的控件QSpaceItem,0为最小值,并将其作为伸缩量添加到布局,参数为一个整数表示控件的比例,默认为0。

一个完整的用例

import sys
from Qt import QtWidgets, QtCore, QtGui


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.head_widget = None
        self.head_layout = None
        self.global_layout = None
        self.global_widget = None
        self.global_group = None
        self.initUI()

    def initUI(self):
        self.setWindowTitle("simple test")
        self.setGeometry(1800, 100, 385, 480)
        self.setGlobalUI()
        self.setHeaderUI()
        self.setBottomUI()
        self.show()

    def add_SpinBox(self):
        Component_label = QtWidgets.QLabel(self.global_widget)
        Component_label.setText("微调框")

        newComponent = QtWidgets.QSpinBox(self.global_widget)
        newComponent.setMinimum(0)
        newComponent.setMaximum(100)
        newComponent.setValue(1)

        self.add_layout(Component_label, newComponent)

    def add_ComboBox(self):
        Component_label = QtWidgets.QLabel(self.global_widget)
        Component_label.setText("下拉框")
        newComponent = QtWidgets.QComboBox(self.global_widget)
        newComponent.addItems(["选项1", "选项2"])
        newComponent.addItem("选项3")
        newComponent.addItem(QtGui.QIcon("help.png"), "选项4")
        newComponent.setCurrentIndex(1)

        self.add_layout(Component_label, newComponent)

    def add_Slider(self):
        Component_label = QtWidgets.QLabel(self.global_widget)
        Component_label.setText("滑动条")
        newComponent = QtWidgets.QSlider(self.global_widget)
        newComponent.setMinimum(1)
        newComponent.setMaximum(100)
        newComponent.setValue(50)
        newComponent.setOrientation(QtCore.Qt.Horizontal)

        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(newComponent.sizePolicy().hasHeightForWidth())
        newComponent.setSizePolicy(sizePolicy)

        self.add_layout(Component_label, newComponent)

    def add_CheckBox(self):
        Component_label = QtWidgets.QLabel(self.global_widget)
        Component_label.setText("复选框")
        newComponent = QtWidgets.QCheckBox(self.global_widget)
        newComponent.setChecked(True)

        self.add_layout(Component_label, newComponent)

        Component_label = QtWidgets.QLabel(self.global_widget)
        Component_label.setText("三态复选框")
        newComponent = QtWidgets.QCheckBox(self.global_widget)
        newComponent.setTristate(True)
        newComponent.setCheckState(QtCore.Qt.PartiallyChecked)

        self.add_layout(Component_label, newComponent)

    def add_layout(self, Component_label, Component):
        horizontalLayout = QtWidgets.QHBoxLayout()
        horizontalLayout.addWidget(Component_label)
        horizontalLayout.addWidget(Component)

        self.global_layout.addLayout(horizontalLayout)

    def setGlobalUI(self):
        self.global_group = QtWidgets.QGroupBox(self)
        self.global_widget = QtWidgets.QWidget(self.global_group)
        self.global_layout = QtWidgets.QVBoxLayout(self.global_widget)

        self.global_group.setGeometry(QtCore.QRect(10, 40, 360, 350))
        self.global_group.setTitle("全局")

        self.global_widget.setGeometry(QtCore.QRect(20, 20, 330, 320))

        self.global_layout.setContentsMargins(0, 0, 0, 0)

        self.add_SpinBox()
        self.add_ComboBox()
        self.add_Slider()
        self.add_CheckBox()

    def setHeaderUI(self):
        help_button = QtWidgets.QToolButton(self)
        help_button.setGeometry(QtCore.QRect(320, 7, 30, 31))
        help_button.setIcon(QtGui.QIcon("help.png"))

        Component_label = QtWidgets.QLabel(self)
        Component_label.setGeometry(QtCore.QRect(20, 7, 100, 30))
        Component_label.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken)
        Component_label.setText("右下对齐")
        Component_label.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)

    def setBottomUI(self):
        default_para = QtWidgets.QPushButton(self)
        default_para.setGeometry(QtCore.QRect(10, 400, 91, 23))
        default_para.setText("恢复默认参数")

        progressBar = QtWidgets.QProgressBar(self)
        progressBar.setGeometry(QtCore.QRect(10, 430, 350, 23))
        progressBar.setValue(10)
        progressBar.setStyleSheet(
            "QProgressBar { border: 2px solid grey; border-radius: 5px; color: rgb(20,20,20);  background-color: #FFFFFF; text-align: center;}QProgressBar::chunk {background-color: rgb(100,200,200); border-radius: 10px; margin: 0.1px;  width: 1px;}")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()

    sys.exit(app.exec_())

完整用例
这里将上述的控件都使用上,通过从初始化函数的调用,添加各个控件,在主线程中启动Qt程序并显示。