美文网首页
PySide2学习记录(七):自定义信号与槽

PySide2学习记录(七):自定义信号与槽

作者: 3ni | 来源:发表于2018-11-25 10:00 被阅读0次

Python版本3.7
PySide2 Version: 5.14.1
官方文档:http://doc.qt.io/qtforpython/index.html

当Qt给我们提供的信号与槽不够用,或者需要自己封装某些控件,并向外提供改变内部控件的接口时,就要自定义信号与槽了。

from PySide2.QtWidgets import QLCDNumber, QSlider, QWidget, QVBoxLayout, QApplication, QGridLayout, QPushButton
from PySide2.QtCore import Qt
from PySide2.QtCore import Signal, Slot

class MyLCDNumber(QWidget):
    # 自定义一个信号,需要传入一个int类型的参数
    slider_valueChanged_signal = Signal(int)

    def __init__(self, parent=None):
        super().__init__(parent)

        self.lcd_number = QLCDNumber()
        # 初始化一个水平的slider,默认是垂直的
        self.slider = QSlider(Qt.Horizontal)
        self.btn_add = QPushButton('加一')
        # 垂直布局
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.lcd_number)
        self.layout.addWidget(self.slider)
        self.layout.addWidget(self.btn_add)

        self.setLayout(self.layout)
        # 设置整个控件的固定大小
        self.setFixedSize(120, 140)

        # 设置最多显示两位数
        self.lcd_number.setDigitCount(2)
        # 设置可以调节的范围大小
        self.slider.setRange(0, 99)
        # 信号与信号的连接
        self.slider.valueChanged.connect(self.slider_valueChanged_signal)
        # 信号与槽点连接
        self.btn_add.clicked.connect(self.add)

    # 自定义一个槽
    @Slot()
    def setLCDNumberValue(self, val):
        self.lcd_number.display(val)

    @Slot()
    def add(self):
        v = self.slider.value() + 1
        self.slider.setValue(v)
        # 主动发送信号
        self.slider_valueChanged_signal.emit(v)


app = QApplication()
window = QWidget()
# 网格布局
layout = QGridLayout()
mylcdnumber01 = MyLCDNumber()
mylcdnumber02 = MyLCDNumber()
mylcdnumber01.slider_valueChanged_signal.connect(mylcdnumber01.setLCDNumberValue)
mylcdnumber02.slider_valueChanged_signal.connect(mylcdnumber02.setLCDNumberValue)
layout.addWidget(mylcdnumber01, 1, 1)
layout.addWidget(mylcdnumber02, 1, 2)
window.setLayout(layout)
window.show()
app.exec_()

运行结果:

图1

代码中涉及到了信号与槽的自定义,信号的传递和信号的发送。

首先是信号的自定义slider_valueChanged_signal = Signal(int),使用Qt给我们提供的Signal类来创建一个信号,可以传入需要传递的参数类型,注意信号需要在类里面定义,不要放在__init__里面定义。

定义完信号后就可以使用emit()来进行信号的发送,可以传入需要传递的参数,前提是要与定义的信号参数类型一致。

然后就是自定义槽,槽的自定义就是定义一个函数,然后使用Qt为我们提供的Slot装饰器进行装饰,然后就可以进行信号与槽的连接

信号不仅仅可以连接到槽,还可以连接到信号,即信号的传递。当我们封装一个控件的时候,往往需要将这个控件的信号暴露出来,但是又不能在外面直接操作这个控件,如果这样的话就破坏了封装性,所以我们可以将这个控件的信号连接到我们自定义的另一个信号,从而不用直接操作内部控件。

友情链接:
Signal
Slot

相关文章

  • PySide2学习记录(七):自定义信号与槽

    Python版本3.7PySide2 Version: 5.14.1官方文档:http://doc.qt.io/q...

  • PySide2学习记录(二):信号与槽

    Python版本3.7PySide2 Version: 5.14.1官方文档:http://doc.qt.io/q...

  • 信号与槽机制

    在PySide2中,有个信号与槽机制。 那这个东西是什么意思呢? 首先,在PySide2中,每个控件都有属于自己的...

  • PyQt信号与槽之信号与槽的入门应用(一)

    前言 信号与槽有三种使用方法第一种:内置信号与槽的使用第二种:自定义信号与槽的使用第三种:装饰器的信号与槽的使用 ...

  • 信号与槽(SIGNAL-SLOT)

    一、系统设置槽-信号 在QtCreator中建立槽信号事件 设置槽事件 设置信号事件 二、自定义槽信号事件 设置对...

  • Qt学习-2.信号与槽

    信号与槽 连接函数书写 ①③为对象指针,分别为发起者与接收者。④等待②的信号被发出 自定义槽 MainWindow...

  • Qt自定义信号槽

    自定义信号槽 关于Q_OBJECT宏 只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必...

  • Qt5 - 3. 自定义信号&槽

    信号&槽是 Qt 的核心特性之一,Qt 允许我们自定义信号&槽,因此我们可以在 Qt 程序中定义我们自己的信号&槽...

  • PySide2信号与槽连接新语法注意地方

    旧语法 旧语法采用了SIGNAL ()和SLOT()宏 新语法 新语法采用了python的风格 新语法注意地方 把...

  • WebRTC信号和槽机制

    信号和槽的实现原理大致是这样的 : 信号对象持有连接,连接里记录了槽对象的地址和槽函数(某个成员函数)地址信号对象...

网友评论

      本文标题:PySide2学习记录(七):自定义信号与槽

      本文链接:https://www.haomeiwen.com/subject/amwtqqtx.html