在主线程上,可以控制子线程启动,停止,清零
如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。
程序截图:
上代码:
#include <QtGui> #include <QtCore> #include <windows.h> 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); }; Thread::Thread(QObject *parent) { number = 0; } Thread::~Thread() { } void Thread::run() { while(1) { //开启一个死循环,让number每秒自增1,并通过发送UpdateSignal信号通知主界面更新 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(); } #include "main.moc" int main(int argc, char **argv) { QApplication app(argc, argv); Widget *widget = new Widget; widget->show(); return app.exec(); }