Python使用QtDesigner生成Winform窗体实现信号signal和槽slot的连接,并将Ui自动转换为Python代码
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:
(2).从左侧工具栏中选择PushButton和Line Edit按住鼠标不放拖动到主窗体,可以在右侧属性中修改控件的名称和属性,这里就使用默认的(可自己添加更多的控件):
(3).接下来,做一个简单的功能,点击Pushbutton后将LineEdit中的文字清除掉:
在右下角的signal/slot Edit 位置点击+号,新增一个signal和solt;
Sender选择pushButton,Signal选择clicked(),Receiver选择lineEdit,Slot选择clear();
这里的信号和槽的意义:pushButton的鼠标点击产生一个信号(clicked),这个信号发送给lineEdit对象接受,lineEdit接受到信号后执行槽里面的响应(clear),结果就是清空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代码如下:
# -*- 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写的Winform窗体程序就完成了,可以自己增加更多的控件,实现自定义的功能。
欢迎交流学习(python业余爱好者):扫码加我的微信