通俗的理解信号与槽
信号与槽(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
在这里插入代码片
#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()的返回值
|