目录
1、信号的定义
2、槽定义
3、信号和槽连接
4、信号与槽断开连接
5、伪代码展示
6、注意
Qt中的信号(signals)和槽(slots)是一种用于实现对象间通信的机制,广泛用于Qt应用程序中,特别是在图形用户界面(GUI)开发中。信号和槽机制允许对象之间以松散耦合的方式进行通信,使代码更加模块化和可维护。在代码写法的角度,则使代码最大程度的解耦。
1、信号的定义
在类内使用 signals:进行定义
signals:
void testFun(QString& str); //信号不能也无需实现
信号发射,使用关键字emit
void fun(){
QString str="就是这个感觉";
emit testFun(str);
}
2、槽定义
使用 访问修饰符+ slots:进行定义
private slots:
void testFun1(QString& str);
void testFun2();
void testFun3();
3、信号和槽连接
使用connect进行连接
QMetaObject::Connection QObject::connect(
const QObject *sender, //信号发送者
const char *signal, //发送的信号
const QObject *receiver, //信号接收者
const char *method, //表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionType type = Qt::AutoConnection //连接方式,默认自动连接
)
常见写法:
1、connect(this, SIGNAL(selectedModelType->sendData()), this, SLOT(receireData()));
信号和槽的连接方式
Qt::AutoConnection:(默认连接方式)自动方式,由系统自动选择连接方式。
Qt::DirectConnection:直接方式,信号发射时,立即调用槽。
Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入阻塞状态,直到事件处理完毕,若接收方位于发送信号的线程中,则程序会死锁,故此连接方式仅用于多线程。
4、信号与槽断开连接
QObject::disconnect(
const QObject* sender,
const char* signal,
const QObject *receiver,
const char* method
);
5、伪代码展示
// 定义一个发送信号的类
class MySender : public QObject {
Q_OBJECT
public:
MySender() {}
signals:
void mySignal(int value);
};
// 定义一个接收信号的类
class MyReceiver : public QObject {
Q_OBJECT
public slots:
void mySlot(int value) {
qDebug() << "Received value: " << value;
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MySender sender;
MyReceiver receiver;
// 建立信号和槽的连接
QObject::connect(&sender, SIGNAL(mySignal(int)), &receiver, SLOT(mySlot(int)));
// 发射信号,将触发槽函数
emit sender.mySignal(42);
return app.exec();
}
6、注意
- 信号与槽机制是类型安全的,相关联的信号与槽参数必须匹配
- 信号与槽是松耦合的,信号发送者不知道也不需知道接受者的信息。
- 信号与槽可以使用任意类型的任意数量的参数。
- 信号与槽可以一对一、一对多、多对一进行连接。