Signals and Slots 信号和插槽

27 篇文章 1 订阅

Signals and Slots 信号和插槽

由于Qt的性质,需要一种通信方式,这就是这种机制成为Qt的核心特征的原因。QObject

简单来说,您可以像与房屋中的灯光互动一样理解信号和插槽。当您移动电灯开关(信号)时,您得到的结果可能是您的灯泡已打开/关闭(插槽)。

在开发接口时,您可以通过单击按钮的效果获得一个真实的例子:“单击”将是信号,而插槽将是单击该按钮时发生的情况,例如关闭窗口,保存文档等。

所有继承自或其子类之一的类(如)都可以包含信号和槽。当对象以其他对象可能感兴趣的方式更改其状态时,它们会发出信号。这就是对象进行通信的全部内容。它不知道也不关心是否有任何东西正在接收它发出的信号。这是真正的信息封装,并确保对象可以用作软件组件。QObjectQWidget

插槽可用于接收信号,但它们也是普通的成员函数。就像一个物体不知道是否有任何东西接收到它的信号一样,一个插槽也不知道它是否有任何信号连接到它。这确保了可以使用Qt创建真正独立的组件。

您可以将任意数量的信号连接到单个插槽,并且信号可以根据需要连接到任意数量的插槽。甚至可以将一个信号直接连接到另一个信号。(每当发出第一个信号时,这将立即发出第二个信号。

Qt的小部件有许多预定义的信号和插槽。例如,QAb 字符串按钮(Qt 中按钮的基本类)具有单击 () 信号,而 QLine 编辑(单行输入字段)具有名为“清除()”的插槽。因此,可以通过在QLineEdit的右侧放置一个QTool按钮并将其单击()信号连接到插槽“clear()”来实现带有清除文本按钮的文本输入字段。这是使用信号的连接()方法完成的:

实际上,可以将同名的信号和槽用于不同的参数类型列表。这是Qt 5的遗留物,不建议用于新代码。在 Qt 6 中,信号对于不同类型的信号具有不同的名称。

以下示例对信号和槽使用两个处理程序来展示不同的功能。

import sys
from PySide6.QtWidgets import QApplication, QPushButton
from PySide6.QtCore import QObject, Signal, Slot


class Communicate(QObject):
    # create two new signals on the fly: one will handle  # 动态创建两个新信号:一个将处理
    # int type, the other will handle strings  # Int类型,另一个处理字符串
    speak = Signal((int,), (str,))

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

        self.speak[int].connect(self.say_something)
        self.speak[str].connect(self.say_something)

    # define a new slot that receives a C 'int' or a 'str'  # 定义一个接收C 'int'或'str'的新槽位
    # and has 'say_something' as its name  # 并且有'say_something'作为它的名字
    @Slot(int)
    @Slot(str)
    def say_something(self, arg):
        if isinstance(arg, int):
            print("This is a number:", arg)
        elif isinstance(arg, str):
            print("This is a string:", arg)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    someone = Communicate()

    # emit 'speak' signal with different arguments.  # 用不同的参数发出'speak'信号。
    # we have to specify the str as int is the default  # 我们必须指定STR,因为int是默认值
    someone.speak.emit(10)  # 传参为int类型时
    someone.speak[str].emit("Hello everybody!")  # 传参为str类型时

在这里插入图片描述
按方法签名字符串指定信号和槽
信号和槽也可以指定为通过 SIGNAL() 和/或 SLOT() 函数传递C++方法签名字符串:

from PySide6.QtCore import SIGNAL, SLOT

button.connect(SIGNAL("clicked(Qt::MouseButton)"),
              action_handler, SLOT("action1(Qt::MouseButton)"))

不建议将其用于连接信号,它主要用于指定 QWizardPage::寄存器字段()等方法的信号:

wizard.registerField("text", line_edit, "text",
                     SIGNAL("textChanged(QString)"))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以给你一个简单的 Qt SlotsSignals 的示例。 假设你有一个简单的窗口应用程序,其中包含一个按钮和一个标签。当点击按钮时,标签上会显示一条消息。 首先,你需要在你的窗口类中定义一个信号和一个槽函数。你可以这样做: ```cpp class MyWindow : public QWidget { Q_OBJECT public: MyWindow(QWidget *parent = nullptr) : QWidget(parent) { // 创建按钮和标签 QPushButton *button = new QPushButton("点击我", this); QLabel *label = new QLabel(this); // 连接按钮的点击信号到标签的显示槽函数 connect(button, &QPushButton::clicked, this, [=]() { label->setText("你点击了按钮!"); }); // 使用布局管理器将按钮和标签添加到窗口中 QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(button); layout->addWidget(label); } }; ``` 在上面的代码中,我们定义了一个名为 `MyWindow` 的窗口类,并在构造函数中创建了按钮和标签。然后,我们使用 `connect` 函数将按钮的 `clicked` 信号连接到标签的 `setText` 槽函数。 最后,我们使用布局管理器将按钮和标签添加到窗口中,以确保它们能够正确地显示。 要使用这个窗口类,你需要在你的主函数中实例化它: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWindow window; window.show(); return app.exec(); } ``` 这只是一个简单的示例,但它演示了如何使用 QtSlotsSignals 机制来实现交互式的窗口应用程序。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值