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

QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽

2015-11-25 07:43 579 查看
在主线程上,可以控制子线程启动,停止,清零

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

程序截图:



上代码:

[cpp] view plaincopyprint?

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

}

/article/2021938.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: