您的位置:首页 > 产品设计 > UI/UE

QT子线程发射信号,UI接收信号刷新UI

2013-12-16 21:32 197 查看
#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();  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  QT linux 界面 thread widget