Qt中的signal和slots中的一些认识

Posted on 2018-08-16 16:07  yacbo  阅读(445)  评论(0编辑  收藏  举报

认识1:实现对象间的通信,a对象发射信号后调用b对象的槽函数。

QObject::connect(PA,&A::signalA,PB,&B::B_slot);   //将信号与槽绑定,PA为类A对象指针,PB为类B对象指针.
QObject::disconnect(PA,&A::signalA,PB,&B::B_slot);  //将信号与槽解绑定.
#ifndef A_H
#define A_H
#include <QObject>
class A :public QObject{
    Q_OBJECT
public :
    static A* instance(){
        static A a;
        return &a;
    }
public:
    void emitSignalA(){
        signalA();
    }
signals:
    void signalA();
};
#define PA (A::instance())
#endif // A_H
#ifndef B_H
#define B_H
#include <QDebug>
#include <QObject>

class B:public QObject{
    Q_OBJECT
public :
    static B* instance(){
        static B b;
        return &b;
    }
public slots:
    void B_slot(){
        qDebug()<<"B_slot is called.";
    }
};
#define PB (B::instance())
#endif // B_H
#include <QCoreApplication>
#include "a.h"
#include "b.h"
#include <QThread>
class T:public QThread{
public:
    void run(){
        PA->emitSignalA();
    }
};
int main(int argc, char *argv[]){
    QCoreApplication a(argc, argv);
    //A aa;
    //B bb;
    QObject::connect(PA,SIGNAL(signalA()),PB,SLOT(B_slot()));
    QObject::disconnect(PA,SIGNAL(signalA()),PB,SLOT(B_slot()));
    //PA->emitSignalA();
    T t;
    t.start();

    return a.exec();
}

场景1:对象a、对象b在主线程中,且signal也在主线程中emit ,则为同步的。

场景2:对象a在子线程,对象b在主线程,a在子线程中emit,则为异步的。

场景3:对象a、b均在主线程,a在线程中emit,则为异步的。

 

 

带参数的信号
connect(VideoPlayerThread, SIGNAL(sig_GetOneFrame(QImage)),this,SLOT(slotGetOneFrame(QImage)));


信号:
void iSignal(int b); 

槽: 
void MainWindow::iSlot(int b)  
{      
  QString qString;     
  qDebug()<<qString.number(b); 


信号和槽绑定:
connect(this, SIGNAL(iSignal(int)), this, SLOT(iSlot(int))); 

 发送信号:

 emit iSignal(5);  



Copyright © 2024 yacbo
Powered by .NET 8.0 on Kubernetes