QT小例子GUI主线程与子线程之间的通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QT小例子GUI(主)线程与子线程之间的通信
在主线程上,可以控制子线程启动,停止,清零
如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。
(但这个程序的实质没有子线程和主线程之间的通信,因为通信的对象(信号与槽)都在主线程里面,要知道QThread本身就是一个对象。)
1.#ifndef TQT_H_
2.#define TQT_H_
3.
4.#include
5.#include
6.
7.class Thread : public QThread
8.{
9.Q_OBJECT
10.private:
11.int number;
12.protected:
13.void run();
14.public:
15.Thread(QObject *parent=0);
16.~Thread();
17.signals:
18.void UpdateSignal(int num);
19.public slots:
20.void ResetSlot();
21.};
22.
24.class Widget : public QWidget
25.{
26.Q_OBJECT
27.private:
28.QLabel *label;
29.QPushButton *startButton;
30.QPushButton *stopButton;
31.QPushButton *resetButton;
32.Thread *myThread;
33.int number;
34.public:
35.Widget(QWidget *parent = 0);
36.~Widget();
37.signals:
38.void ResetSignal();
39.public slots:
40.void ClearSlot();
41.void StartSlot();
42.void StopSlot();
43.void UpdateSlot(int num);
44.};
45.
46.#endif
47.
48.
49.//tqt.cpp
50.#include "tqt.h"
51.#include
52.#include
54.Thread::Thread(QObject *parent)
55.{
56.number = 0;
57.}
58.
59.Thread::~Thread()
60.{
61.
62.}
63.
64.void Thread::run()
65.{
66.while(1)
67.{
68.emit UpdateSignal(number);
69.number++;
70.sleep(1);
71.}
72.}
73.
74.void Thread::ResetSlot()
75.{
76.number = 0;
77.emit UpdateSignal(number);
78.}
79.
80.Widget::Widget(QWidget *parent)
81.{
82.startButton = new QPushButton("start");
83.stopButton = new QPushButton("stop");
84.resetButton = new QPushButton("reset");
bel = new QLabel("empty");
86.myThread = new Thread;
87.QVBoxLayout *layout = new QVBoxLayout;
yout->addWidget(label);
yout->addWidget(startButton);
yout->addWidget(stopButton);
yout->addWidget(resetButton);
92.setLayout(layout);
93.
94.connect(stopButton, SIGNAL(clicked()),
95.this, SLOT(StopSlot()));
96.connect(startButton, SIGNAL(clicked()),
97.this, SLOT(StartSlot()));
98.connect(resetButton, SIGNAL(clicked()),
99.this, SLOT(ClearSlot()));
100.c onnect(myThread, SIGNAL(UpdateSignal(int)), 101.t his, SLOT(UpdateSlot(int)));
102.c onnect(this, SIGNAL(ResetSignal()),
103.m yThread, SLOT(ResetSlot()));
104.
105.
106.s etWindowTitle("Thread Test");
107.r esize(200, 200);
108.m yThread->start();
109.
110.}
111.
112.W idget::~Widget()