GUI(主)线程与子线程之间的通信

在主线程上,可以控制子线程启动,停止,清零

如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。


程序截图:



上代码:

#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();  
} 



  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值