认识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);