Qt之信号槽(一:基本应用)

信号槽连接实例

一:信号槽使用教程代码

//头文件
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 防止重复连接。如果当前信号和槽已经连接过了,就不再连接了。

 

你可能感兴趣的:(QT应用)