/ Published in: C++
URL: Qt signaling across threads.
Expand |
Embed | Plain Text
//main.cpp// #include <QtGui/QApplication> #include <QWidget> #include <QHBoxLayout> #include <QLineEdit> #include <QPushButton> #include "thread.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget widget; //GUI QHBoxLayout layout; QLineEdit *line; QPushButton *button; layout.addWidget(line = new QLineEdit("Default string",&widget)); layout.addWidget(button = new QPushButton("Increment",&widget)); widget.setLayout(&layout); //Thread creation Thread thread; thread.start(); qDebug("Thread id inside run %d",(int)QThread::currentThreadId()); //Connections QObject::connect(button,SIGNAL(clicked()),&thread,SIGNAL(updateObject())); QObject::connect(&thread,SIGNAL(updateLineEdit(QString)),line,SLOT(setText(QString))); widget.show(); return a.exec(); } //thread.h// #ifndef THREAD_H #define THREAD_H #include <QThread> #include "object.h" class Thread : public QThread { Q_OBJECT public: Thread(); ~Thread(); public slots: void emitUpdateObject(); void emitUpdateLineEdit(QString); signals: void updateObject(); void updateLineEdit(QString); private: Object object; protected: void run(); }; #endif // THREAD_H //thread.cpp// #include "thread.h" Thread::Thread() { object.moveToThread(this); connect(this,SIGNAL(updateObject()),&object,SLOT(doTimeConsumingWork()));//Queued connection connect(&object,SIGNAL(finishedComplexWork(QString)),this,SLOT(emitUpdateLineEdit(QString))); } void Thread::emitUpdateObject(){ emit updateObject(); } void Thread::emitUpdateLineEdit(QString str){ emit updateLineEdit(str); } void Thread::run(){ exec(); } Thread::~Thread(){ quit(); wait(); } //object.h// #ifndef OBJECT_H #define OBJECT_H #include <QObject> #include <QMutex> class Object : public QObject { Q_OBJECT public: explicit Object(QObject *parent = 0); signals: void finishedComplexWork(QString); public slots: void doTimeConsumingWork(); private: QMutex mutex; }; #endif // OBJECT_H //object.cpp// #include "object.h" #include <QDebug> #include <QThread> Object::Object(QObject *parent) : QObject(parent) { } void Object::doTimeConsumingWork(){ for(unsigned int i = 0;i<10000;++i){ //do nothing qDebug("Thread id inside run %d",(int)QThread::currentThreadId()); } static int a = 1; QMutexLocker guard(&mutex); ++a; QString txt("Modified"); txt += QString::number(a); emit finishedComplexWork(txt); }
You need to login to post a comment.
