Python使用QtDesigner生成Winform窗体实现信号signal和槽slot的连接,并将Ui自动转换为Python代码

  • 1.安装QtDesigner和PyQt5
  • 2.使用QtDesigner设计自己的UI界面
  • (1).打开designer.exe,进入选择Main Window(主窗体),点击Creat:
  • (2).从左侧工具栏中选择PushButton和Line Edit按住鼠标不放拖动到主窗体,可以在右侧属性中修改控件的名称和属性,这里就使用默认的(可自己添加更多的控件):
  • (3).接下来,做一个简单的功能,点击Pushbutton后将LineEdit中的文字清除掉:
  • (4).设置号信号和槽后,designer可以直接模拟运行窗体,点击Form→Preview in→Windows Style,运行窗体,在文本框中输入文字,点击pushButton后,文字被清除:
  • 3.将designer设计的ui文件转换为Python代码
  • (1).点击File→Save,保存刚才设计的窗体ui文件
  • (2).切换到保存的ui文件目录,按住shift键,鼠标右键后选择在此处打开power shell,输入指令:pyuic5 -o myui.py untitled.ui,myui.py为你将要保存的py文件名,后面的untitled.ui为刚才保存的ui文件:
  • 4.在Python中运行窗体,并实现自己的signal和slot连接
  • (1).为了后面在更新主窗体UI界面时,生成py代码更好的维护,我们新建一个类继承ui类,在继承的类中实现自己的代码,这样后续更新主窗体后直接覆盖myui.py文件就可以了。
  • (2).自动生成的myui.py代码如下:
  • (3).自定义一个新的类,继承自动生成的类中的Ui_MainWindow,并定义pushButton的clicked响应,这里就显示文本“Hello,World!”。
  • (4).完成后,启动窗体,并点击pushButton,自动在文本框中写入文本“Hello,World!”,代码如下:


1.安装QtDesigner和PyQt5

QtDesigner是一款Qt的Ui设计工具,能像C#winform程序一样拖控件到界面上,PyQt5是Python的桌面程序库,安装方式如下:

pip install pyqt5_tools # 只有安装了这个后,就有QtDesigner
pip install PyQt5 # 安装PyQt5的包

安装完成后,可以在Python中引用PyQt5的包,同时安装完成后QtDesigner的设计工具的路径为*D:\Program Files (x86)* Python38-32\Lib\site-packages\pyqt5_tools\Qt\bin\designer.exe,前面的目录是你自己Python的安装目录。

2.使用QtDesigner设计自己的UI界面

(1).打开designer.exe,进入选择Main Window(主窗体),点击Creat:

python thinker 窗口长度超出屏幕时添加滚动条_python

(2).从左侧工具栏中选择PushButton和Line Edit按住鼠标不放拖动到主窗体,可以在右侧属性中修改控件的名称和属性,这里就使用默认的(可自己添加更多的控件):

python thinker 窗口长度超出屏幕时添加滚动条_winform_02

(3).接下来,做一个简单的功能,点击Pushbutton后将LineEdit中的文字清除掉:

在右下角的signal/slot Edit 位置点击+号,新增一个signal和solt;

Sender选择pushButton,Signal选择clicked(),Receiver选择lineEdit,Slot选择clear();

这里的信号和槽的意义:pushButton的鼠标点击产生一个信号(clicked),这个信号发送给lineEdit对象接受,lineEdit接受到信号后执行槽里面的响应(clear),结果就是清空lineEdit里面的文本内容。

一个信号可以对应多个槽,一个槽也可以接收多个信号的响应。

python thinker 窗口长度超出屏幕时添加滚动条_python_03

(4).设置号信号和槽后,designer可以直接模拟运行窗体,点击Form→Preview in→Windows Style,运行窗体,在文本框中输入文字,点击pushButton后,文字被清除:

python thinker 窗口长度超出屏幕时添加滚动条_python_04


python thinker 窗口长度超出屏幕时添加滚动条_winform_05

3.将designer设计的ui文件转换为Python代码

(1).点击File→Save,保存刚才设计的窗体ui文件
(2).切换到保存的ui文件目录,按住shift键,鼠标右键后选择在此处打开power shell,输入指令:pyuic5 -o myui.py untitled.ui,myui.py为你将要保存的py文件名,后面的untitled.ui为刚才保存的ui文件:

python thinker 窗口长度超出屏幕时添加滚动条_winform_06

4.在Python中运行窗体,并实现自己的signal和slot连接

(1).为了后面在更新主窗体UI界面时,生成py代码更好的维护,我们新建一个类继承ui类,在继承的类中实现自己的代码,这样后续更新主窗体后直接覆盖myui.py文件就可以了。
(2).自动生成的myui.py代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled.ui'
# Created by: PyQt5 UI code generator 5.13.2
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(591, 370)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(240, 180, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(220, 120, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 591, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
		
        self.retranslateUi(MainWindow)
        # 这里将我们前面新增的pushbButton和lineEdit的连接删掉,我们在继承的类中自定义
		# self.pushButton.clicked.connect(self.lineEdit.clear)
        # QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
(3).自定义一个新的类,继承自动生成的类中的Ui_MainWindow,并定义pushButton的clicked响应,这里就显示文本“Hello,World!”。
from myui import Ui_MainWindow
import sys
from PyQt5 import QtWidgets, QtCore


class MyWinform(Ui_MainWindow):
    def connect_signal_slot(self, MainWindow):
        self.pushButton.clicked.connect(self.send_txt)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def send_txt(self):
        self.lineEdit.setText("Hello,World!")
(4).完成后,启动窗体,并点击pushButton,自动在文本框中写入文本“Hello,World!”,代码如下:
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = MyWinform()  # 创建对象
    ui.setupUi(MainWindow)  # 调用父类的setupUi,生成控件
    ui.connect_signal_slot(MainWindow)  # 连接pushbutton的clicked信号和自定义的槽sendtxt
    MainWindow.show()  # 显示主窗体
    sys.exit(app.exec_())

运行的效果如下:

python thinker 窗口长度超出屏幕时添加滚动条_qt_07


到这里一个简单的Python写的Winform窗体程序就完成了,可以自己增加更多的控件,实现自定义的功能。