信号槽连接实例
一:信号槽使用教程代码
//头文件
class MyClass : public QObject
{
//Q_OBJECT是个宏,要想使用信号槽必须是QObject的子孙类,且必须在头文件中使用这个宏
Q_OBJECT
signals: //信号定义区 信号也是函数,但是不用实现
void mySignal();
void mySignal_2(QString arg1);
private slots:
void myslot();
void myslot(QString arg1);
};
//cpp文件
MyClass::MyClass(){
//信号槽的正常连接 参数相等
connect(this, SIGNAL(mySignal()), this, SLOT(myslot()), Qt::AutoConnection);
connect(this, SIGNAL(mySignal_2(QString)), this, SLOT(myslot(QString)), Qt::AutoConnection);
//信号一定要比槽函数的参数多
connect(this, SIGNAL(mySignal_2(QString)), this, SLOT(myslot()), Qt::AutoConnection);
//信号的发送
emit myslot();
QString arg;
emit myslot(arg);
}
void MyClass::myslot(){
}
void MyClass::myslot(QString arg1){
}
二:信号槽的连接
//信号槽的连接方式一:
//参数一共有五个:分别是发送者,信号的地址,接收者, 响应的参数 连接类型
connect(QObject*sender, QObject::signal, QObject*receiver, QObject::method,Qt::ConnectionType type = Qt::AutoConnection)
//信号槽的连接方式二: 参数和一相同,只是采用了:SIGNAL(),SLOT()的表现形式
connect(QObject*sender, SIGNAL(signal()), QObject*receiver, SLOT(method()), Qt::ConnectionType type = Qt::AutoConnection)
//信号槽的连接方式三: 五参数的lambda表达式
connet(QObject *sender,QObject::signal,[&](){;})
三:信号槽连接的第五个参数介绍
连接类型参数 | 介绍 |
Qt::AutoConnection | 自动连接:默认的方式。信号发出的线程和糟的对象在一个线程的时候相当于:DirectConnection, 如果是在不同线程,则相当于QueuedConnection |
Qt::DirectConnection | 直接连接:相当于直接调用槽函数,但是当信号发出的线程和槽的对象不再一个线程的时候,则槽函数是在发出的信号中执行的。 |
Qt::QueuedConnection | 队列连接:内部通过postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。如果信号参数是引用类型,则会另外复制一份的。线程安全的。 |
Qt::BlockingQueuedConnection | 阻塞连接:此连接方式只能用于信号发出的线程 和 槽函数的对象不再一个线程中才能用。通过信号量+postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。但是发出信号后,当前线程会阻塞,等待槽函数执行完毕后才继续执行。 |
Qt::UniqueConnection | 防止重复连接。如果当前信号和槽已经连接过了,就不再连接了。 |