<>通俗的理解信号与槽
信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt
中处理界面各个组件的交互操作时变得更加直观和简单。
信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked()
信号。发射信号使用Qt的emit关键字。QT 的 signals 关键字指出进入了信号声明区,随后即可声明自己的信号。
以上是比较官方的理解方式,但是我们可以通俗的理解为:
信号的存在是为了给槽方法进行通信,传输信息,哪怕不在一个界面。说先将一个槽方法绑定指定的信号,当别的组件需要调用该方法时候,直接调用被绑定的信号即可。
因为信号绑定比较灵活,关联的时候有一对一,一对多,多对一,多对多的关系
如下演示的就是一个槽对一个信号的传输:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui {
class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public:
explicit MainWindow(QWidget *parent = 0); ~MainWindow(); signals: void comeon(
QString&str); //信号与曹不能实现,也无需实现 private slots: void on_WHButton_clicked(); void
iamwuhan(QString &str); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
在这里插入代码片 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QDebug>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::
MainWindow) { ui->setupUi(this); connect(this,SIGNAL(comeon(QString&)),this,SLOT
(iamwuhan(QString&))); } MainWindow::~MainWindow() { delete ui; } void
MainWindow::on_WHButton_clicked() { QString str="你好武汉!"; comeon(str); } void
MainWindow::iamwuhan(QString &str) { qDebug() <<str; }
点击这里的武汉的按钮,就会发送“你好武汉!”
先定义一个槽A,定义一个槽B。然后定义一个信号c。
用一个从connect函数关联槽B和信号c。之后槽A调用信号c,就会调用函数
B。
①一个信号连接一个槽:
connect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
②一个信号连接一个信号:
connect(sender, SIGNAL(single1()), receiver, SIGNAL(single2()));
③一个信号连接多个槽,关联信号的槽函数按照建立连接时的顺序依次执行:
connect(sender, SIGNAL(single1()), receiver1, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver2, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver3, SLOT(slotFun()));
④多个信号连接一个槽:
connect(sender1, SIGNAL(single1()), receiver, SLOT(slotFun()));
connect(sender2, SIGNAL(single2()), receiver, SLOT(slotFun()));
connect(sender3, SIGNAL(single3()), receiver, SLOT(slotFun()));
⑤ 信号与槽的自动关联:
ui_xxxx.h文件中
connectSlotsByName()方法通过对象名支持信号与槽的自动关联。不采用connect()函数而是采用on_objectName_signal命名方式命名槽达到自动关联的效果。
信号与槽的断开关联:
QObject::disconnect(const QObject* sender,const char* signal,const QObject
receiver,const char method);
①断开与一个对象所有的信号的所有关联
disconnect(sender,0,0,0);
等价于:
sender->disconnect();
②断开与一个指定信号的所有关联
disconnect(sender, SIGNAL(single1()), 0, 0);
等价于:
sender->disconnect(SIGNAL(single1()));
③ 断开与一个指定接受者receiver的所有关联
disconnect(sender, 0, receiver, 0);
等价于:
sender->disconnect(SIGNAL(single1()));
④断开指定信号与槽的关联:
disconnect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
等价于:
disconnect(myConnection); //myConnection为connect()的返回值