QT小例子GUI(主)线程与子线程之间的通信实例源码介绍,在主线程上,可以控制子线程启动,停止,清零。
如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。
- #ifndef TQT_H_
- #define TQT_H_
-
- #include
- #include
-
- class Thread : public QThread
- {
-
Q_OBJECT - private:
-
int number; - protected:
-
void run(); - public:
-
Thread(QObject *parent=0); -
~Thread(); - signals:
-
void UpdateSignal(int num); -
public slots: -
void ResetSlot(); - };
-
- class Widget : public QWidget
- {
-
Q_OBJECT - private:
-
QLabel *label; -
QPushButton *startButton; -
QPushButton *stopButton; -
QPushButton *resetButton; -
Thread *myThread; -
int number; - public:
-
Widget(QWidget *parent = 0); -
~Widget(); - signals:
-
void ResetSignal(); -
public slots: -
void ClearSlot(); -
void StartSlot(); -
void StopSlot(); -
void UpdateSlot(int num); - };
-
- #endif
-
-
- //tqt.cpp
- #include “tqt.h”
- #include
- #include
-
- Thread::Thread(QObject *parent)
- {
-
number = 0; - }
-
- Thread::~Thread()
- {
-
- }
-
- void Thread::run()
- {
-
while(1) -
{ -
emit UpdateSignal(number); -
number++; -
sleep(1); -
} - }
-
- void Thread::ResetSlot()
- {
-
number = 0; -
emit UpdateSignal(number); - }
-
- Widget::Widget(QWidget *parent)
- {
-
startButton = new QPushButton(“start”); -
stopButton = new QPushButton(“stop”); -
resetButton = new QPushButton(“reset”); -
label = new QLabel(“empty”); -
myThread = new Thread; -
QVBoxLayout *layout = new QVBoxLayout; -
layout->addWidget(label); -
layout->addWidget(startButton); -
layout->addWidget(stopButton); -
layout->addWidget(resetButton); -
setLayout(layout); -
-
connect(stopButton, SIGNAL(clicked()), -
this, SLOT(StopSlot())); -
connect(startButton, SIGNAL(clicked()), -
this, SLOT(StartSlot())); -
connect(resetButton, SIGNAL(clicked()), -
this, SLOT(ClearSlot())); -
connect(myThread, SIGNAL(UpdateSignal(int)), -
this, SLOT(UpdateSlot(int))); -
connect(this, SIGNAL(ResetSignal()), -
myThread, SLOT(ResetSlot())); -
-
-
setWindowTitle(“Thread Test”); -
resize(200, 200); -
myThread->start(); -
- }
-
- Widget::~Widget()
- {
-
- }
-
- void Widget::StartSlot()
- {
-
myThread->start(); - }
-
- void Widget::StopSlot()
- {
-
myThread->terminate(); - }
-
- void Widget::UpdateSlot(int num)
- {
-
label->setText(QString::number(num)); - }
-
- void Widget::ClearSlot()
- {
-
emit ResetSignal(); - }
-
- //main.cpp
- #include
- #include “tqt.h”
-
- int main(int argc,char **argv)
- {
-
QApplication app(argc, argv); -
Widget *widget = new Widget; -
widget->show(); -
return app.exec(); - }