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()

最终实现

相关推荐
深蓝海拓6 小时前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
深蓝海拓4 天前
PySide6(PyQT5)的QMessageBox获取被点击按钮的三种方法
开发语言·python·qt·pyqt
飞行codes6 天前
pyqt鸟瞰
pyqt
shanks668 天前
【PyQt】通过load ui来实现菜单栏
ui·pyqt
恋恋西风9 天前
Python PyQt 子类中回调主类的函数,回调
python·pyqt
深蓝海拓10 天前
基于深度学习的视觉检测小项目(十二) 使用线条边框和渐变颜色美化界面
前端·python·pyqt
深蓝海拓11 天前
基于深度学习的视觉检测小项目(十一) 动态样式表的实践
前端·python·pyqt
大学生毕业题目15 天前
毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)
人工智能·python·深度学习·yolo·cnn·pyqt
麦田里的稻草人w15 天前
【pyqt】(八)ui文件使用
python·ui·pyqt
深蓝海拓16 天前
PySide6的样式表
python·pyqt