python之pyqt专栏7-信号与槽3

在上一篇文章中python之pyqt专栏6-信号与槽2-CSDN博客中,我们可以了解到对象可以使用内置信号,这些信号来自于类定义或者继承过来的。我们可以对这些信号可以通过connect连接槽函数。

需求

现在有一个需求,有两个UI界面**"untitled.ui"和"untitled1.ui",untitled.ui** 有一个lineEdit(行编辑)和 一个button(按钮),untitled1.ui 有一个Label。点击untitled.ui的button时,将行编辑的文本内容,设置为untitled1.uiLabel文本内容。

untitled.ui的对象列表

|------------|------------|
| 对象名 | 类型 |
| lineEdit | LlineEdit |
| pushButton | QPushButto |

untitled1.ui的对象列表

|-------|--------|
| 对象名 | 类型 |
| label | QLabel |

UI界面设置

untitled.ui UI界面

保存文件为untitled.ui

untitled1.ui UI界面

点击左上角**"文件"** ->"新建"

保存文件为untitled.ui

注:Qt Designer中,当有两个以上的UI编辑界面时,需要先选中的UI界面,再保存

项目目录下**"untitled.ui"** 和**"untitled1.ui"转换为"untitled.py"** 和**"untitled1.py"**

main.py

python 复制代码
# 导入sys模块
import sys
# PyQt6.QtWidgets模块中导入QApplication, QWidget
from PyQt6.QtWidgets import QApplication, QWidget
from PyQt6.QtCore import QObject

import untitled
import untitled1

class MyMainForm(QWidget, untitled.Ui_Form):
    sendText = pyqtSignal(str)
    def __init__(self, parent=None):
        # 调用父类的构造函数
        super(MyMainForm, self).__init__(parent)
        # 调用继承Ui_Form过来的setupUi函数
        self.setupUi(self)
        self.pushButton.clicked.connect(self.btn_clicked)



class MyMainForm1(QWidget, untitled1.Ui_Form):
    def __init__(self, parent=None):
        # 调用父类的构造函数
        super(MyMainForm1, self).__init__(parent)
        # 调用继承Ui_Form过来的setupUi函数
        self.setupUi(self)
        self.move(1200,320)


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # 实例化应用
    app = QApplication(sys.argv)
    # 实例化MyMainForm
    myw = MyMainForm()
    myw.show()
    myw1 = MyMainForm1()
    myw1.show()
    myw.sendText.connect(myw1.deal_signal)

    # 启动应用程序的事件循环并等待用户交互,直到应用程序关闭。
    sys.exit(app.exec())

防止两个窗口重叠,在MyMainForm1 移动一下位置

python 复制代码
self.move(1200,320)

有两个窗口,建立了两个类MyMainFormMyMainForm1 ,它们分别继承于untitled.Ui_Formuntitled1.Ui_Form

需要注意的是untitled.py与untitled1.py都有Ui_Form,为了区分Ui_Form来源,不能用如下代码,否者会被Ui_Form会被后面的取代

python 复制代码
from untitled import Ui_Form
from untitled1 import Ui_Form

正确书写应该是这样

python 复制代码
import untitled
import untitled1
class MyMainForm(QWidget, untitled.Ui_Form):
class MyMainForm1(QWidget, untitled1.Ui_Form):

问题

MyMainForm ,button 被点击时会发出clicked 信号,如果用将buttonclicked 信号,绑定槽函数,在这个槽函数里面可以实现获取lineEdit的文本内容,代码如下

python 复制代码
self.pushButton.clicked.connect(self.btn_clicked)
python 复制代码
    def btn_clicked(self):
        # 获取行编辑文本
        str = self.lineEdit.text()

MyMainForm与MyMainForm1, 它们是两个类,没有直接关系**,** 这个槽函数在MyMainForm中, 不能修改MyMainForm1的label,也就是不能通过如下代码

python 复制代码
    def btn_clicked(self):
        # 获取行编辑文本
        str = self.lineEdit.text()
        self.label.setText(str)

自定义信号

如果我们可以在untitled.pyUi_Form自定义 一个信号(sendText ),这个信号通过connect 绑定untitled1.pyUi_Form类 函数**(deal_signal),那么它们就会建立关系。**

python 复制代码
 myw.sendText.connect(myw1.deal_signal)
修改代码如下
python 复制代码
# 导入sys模块
import sys
# PyQt6.QtWidgets模块中导入QApplication, QWidget
from PyQt6.QtWidgets import QApplication, QWidget
from PyQt6.QtCore import QObject, pyqtSignal


import untitled
import untitled1

class MyMainForm(QWidget, untitled.Ui_Form):
    sendText = pyqtSignal(str)
    def __init__(self, parent=None):
        # 调用父类的构造函数
        super(MyMainForm, self).__init__(parent)
        # 调用继承Ui_Form过来的setupUi函数
        self.setupUi(self)
        self.pushButton.clicked.connect(self.btn_clicked)

    def btn_clicked(self):
            # 获取行编辑文本
        str = self.lineEdit.text()
        self.sendText.emit(str)



class MyMainForm1(QWidget, untitled1.Ui_Form):
    def __init__(self, parent=None):
        # 调用父类的构造函数
        super(MyMainForm1, self).__init__(parent)
        # 调用继承Ui_Form过来的setupUi函数
        self.setupUi(self)
        self.move(1200,320)
    def deal_signal(self,str):
        self.label.setText(str)



# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # 实例化应用
    app = QApplication(sys.argv)
    # 实例化MyMainForm
    myw = MyMainForm()
    myw.show()
    myw1 = MyMainForm1()
    myw1.show()
    myw.sendText.connect(myw1.deal_signal)

    # 启动应用程序的事件循环并等待用户交互,直到应用程序关闭。
    sys.exit(app.exec())
自定义信号过程
1)导入 pyqtSignal类
python 复制代码
from PyQt6.QtCore import  pyqtSignal
2)定义类中信号属性,"str"是参数
python 复制代码
sendText = pyqtSignal(str)
3)信号与槽绑定
python 复制代码
myw.sendText.connect(myw1.deal_signal)
4)发送信号
python 复制代码
self.sendText.emit(str)

在该项目功能需求中,需要获取MyMainFormlineEdit 的内容,将其内容传递传递给MyMainForm1的deal_signal,并在deal_signal对MyMainForm1的文本设置,因此需要形参"str",如果自定义信号不需要传递内容,则不需要添形参,如下代码即可

python 复制代码
sendText = pyqtSignal()

最终实现

相关推荐
深蓝海拓11 分钟前
PySide6从0开始学习的笔记(二十三)使用QRunnable在线程池中执行临时任务
笔记·python·qt·学习·pyqt
强化试剂1 小时前
荧光标记利器 Alkyne-PEG-FITC;FITC-PEG-Alkyne:核心优势与行业价值
python·flask·pyqt·scipy
深蓝海拓4 天前
PySide6从0开始学习的笔记(二十二) 几种封装信号传递内容的方法
笔记·python·qt·学习·pyqt
赤鸢QAQ4 天前
PySide6批量创建控件
python·qt·pyqt
深蓝海拓6 天前
PySide6之QListWidget 学习
笔记·python·qt·学习·pyqt
大学生毕业题目8 天前
毕业项目推荐:91-基于yolov8/yolov5/yolo11的井盖破损检测识别(Python+卷积神经网络)
python·yolo·目标检测·cnn·pyqt·井盖破损
大学生毕业题目8 天前
毕业项目推荐:92-基于yolov8/yolov5/yolo11的棉花病虫害检测识别系统(Python+卷积神经网络)
python·yolo·目标检测·cnn·pyqt·棉花病虫害
深蓝海拓8 天前
PySide6从0开始学习的笔记(二十一) 使用loadUi直接加载.ui文件
笔记·python·qt·学习·ui·pyqt
深蓝海拓10 天前
PySide6从0开始学习的笔记(二十) qdarkstyle的深入应用
笔记·python·qt·学习·pyqt
我可以将你更新哟10 天前
【PyQT-2】布局管理
pyqt