+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-08(120)

2019-09(98)

2019-10(12)

2019-11(3)

2019-12(15)

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

发布于2020-02-10 17:27     阅读(390)     评论(0)     点赞(5)     收藏(1)


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的包
  • 1
  • 2

安装完成后,可以在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文件:

生成py文件

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"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

(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!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

(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_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行的效果如下:
运行效果
到这里一个简单的Python写的Winform窗体程序就完成了,可以自己增加更多的控件,实现自定义的功能。
欢迎交流学习(python业余爱好者):扫码加我的微信
微信二维码

发布了1 篇原创文章 · 获赞 1 · 访问量 12


所属网站分类: 技术文章 > 博客

作者:yoyo

链接: https://www.pythonheidong.com/blog/article/231014/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)