信号槽
# 信号槽
信号的本质是函数,只需声明,无需实现;槽(槽函数)通常需要执行信号对应的操作。信号和槽需要使用connect
函数进行连接。
connect
函数的一般形式如下:
connect(sender, signal, receiver, slot);
其中,
- sender:发出信号的对象
- signal:发出的信号
- receiver:接收信号的对象
- slot:接收信号后调用的函数
# 自定义信号槽
自定义信号和槽的条件:
- 自定义的类,要继承自
QObject
- 自定义的类,其中要声明一个宏
Q_OBJECT
自定义信号的方法:
在signals
下添加自定义信号即可,返回值为void
:
class X : public QObject {
Q_OBJECT
public:
X(QObject *parent = nullptr);
~X();
signals:
void my_signal();
void my_signal(double arg);
};
自定义槽的方法: 槽函数应与信号的返回值保持一致。
class Person : public QObject {
Q_OBJECT
public:
Person(QObject *parent = nullptr);
~Person();
public slots:
void eat();
void eat(double arg);
};
# 信号槽的连接方式
- SIGNAL/SLOT(Qt4)
- 函数地址(Qt5)
- UI 设计师界面 - 转到槽(仅QtCreator)
- UI 设计师界面 - 信号槽编辑器
- lambda 表达式
在Qt4中连接信号和槽的方法:
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
在Qt5中连接信号和槽的方法:
connect(sender, &Sender::signal, receiver, &Receiver::slot);
# 连接『重载』的信号和槽
Qt4中写法较为简单:
connect(&reason_, SIGNAL(reason()), &eat_, SLOT(go()));
connect(&reason_, SIGNAL(reason(std::wstring)), &eat_,
SLOT(go(std::wstring)));
Qt5中需要单独定义函数指针:
void (Reason::*no_reason)() = &Reason::reason;
void (Eat::*no_reason_go)() = &Eat::go;
connect(&reason_, no_reason, &eat_, no_reason_go);
void (Reason::*have_reason)(std::wstring) = &Reason::reason;
void (Eat::*have_reason_go)(std::wstring) = &Eat::go;
connect(&reason_, have_reason, &eat_, have_reason_go);
# 信号和槽的相互连接
1. 一个信号可以连接多个槽函数
connect(sender, SIGNAL(signal), receiver1, SLOT(fun1()));
connect(sender, SIGNAL(signal), receiver2, SLOT(fun2()));
Qt4执行槽函数随机,Qt5+执行槽函数顺序与建立连接顺序一致
2. 多个信号可以连接同一个槽函数
3. 信号可以连接信号
# 断开连接disconnect
sender.disconnect();
编辑 (opens new window)