Signals and Slots学习笔记(翻译)

Signals and Slots in Depth

信号和槽机制是Qt编程的基础。它使应用程序员能够在对象之间互相不知道任何联系的情况下把这些对象帮定在一起。我们已经连接了一些信号和槽,声明了我们自己的信号和槽,执行自己的槽,发出自己的信号。让我们花点时间深入点看这个机制。

槽与普通的C++成员函数几乎一样。它们可以是virtual,overloaded,public,protected,private,并且可以被其他C++成语函数直接调用。区别是槽可以被信号连接,信号被发送将它自动调用。

connect()声明如下:

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

sender和receiver是指向QObjects的指针,signal和slot是没有参数名的函数signatures(签名)。SIGNAL()和SLOT()宏将转换它们的参数成为一个字符串。

刚才的例子中我们总是连接不同的信号到不同槽,有更多的可能去探究:

1 .     一个信号可以连接很多槽:

        connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));
        connect(slider, SIGNAL(valueChanged(int)),this, SLOT(updateStatusBarIndicator(int)));

        当信号发出,这些槽一个接一个被调用,以任意顺序。

2 .     很多信号可以连接到同样的槽:

        connect(lcd, SIGNAL(overflow()),this, SLOT(handleMathError()));
        connect(calculator, SIGNAL(divisionByZero()),this, SLOT(handleMathError()));

        其中任何一个信号发出时,这个槽被调用。

3.     一个信号可以连接到另一个信号:

        connect(lineEdit, SIGNAL(textChanged(const QString &)),this, SIGNAL(updateRecord(const QString &)));

        当第一个信号发出,第二个信号也会发出.从这点,singnal-singnal连接与signal-slot连接不能区分.

4 .    连接可以被移除:

        disconnect(lcd, SIGNAL(overflow()),this, SLOT(handleMathError()));

        这个很少需要,因为Qt在对象删除的时候自动删除所有包括对象的连接.

 

当连接一个信号到一个槽(或者连接到另一个信号),它们都必须用同样的顺序有同样的参数:

        connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),this, SLOT(processReply(int, const QString &)));

异常情况,如果信号比它连接的槽更多的参数,增加的参数将直接忽略:

        connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),this, SLOT(checkErrorCode(int)));

如果参数类型不符合,或者信号或槽不存在,Qt将输出一个运行时警告.同样,如果参数名被包含在信号或槽signatures(签名)里,Qt将给一个警告.

 

       

 

 

 

 

  • 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、付费专栏及课程。

余额充值