您的位置:首页 > 编程语言 > Qt开发

QT通过线程将数据传递给主函数进行显示

2017-07-19 13:18 357 查看
根据别人的代码,自己重新写一次加深印象。

头文件mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QThread>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>

class Thread : public QThread
{
Q_OBJECT
public:
Thread(QObject *parent=0);
~Thread();
private:
int number;
protected:
void run();
signals:
void UpdateSignal(int num);
public slots:
void ResetSlot();
};

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = 0);
~MainWindow();
QLabel *showNum;
QPushButton *startButton;
QPushButton *stopButton;
QPushButton *resetButton;
Thread *myThread;
int number;
signals:
void ResetSignal();
public slots:
void ClearSlot();
void StartSlot();
void StopSlot();
void UpdateSlot(int num);
};

#endif // MAINWINDOW_H


cpp文件main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}


cpp文件mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("test event"));

myThread = new Thread;
showNum = new QLabel;
startButton = new QPushButton(tr("start"));
stopButton = new QPushButton(tr("stop"));
resetButton = new QPushButton(tr("reset"));

//连接各自信号糟
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()));

//    myThread->start();

QVBoxLayout *vbox = new QVBoxLayout;

vbox->addWidget(showNum);
vbox->addWidget(startButton);
vbox->addWidget(stopButton);
vbox->addWidget(resetButton);

QWidget *centerWindow = new QWidget(this); // 用户在mainwindow类中添加自定义的控件和布局
this->setCentralWidget(centerWindow);
centerWindow->setLayout(vbox);
centerWindow->setMinimumSize( 100, 120 );
}

void MainWindow::StartSlot()
{
myThread->start();
}

void MainWindow::StopSlot()
{
myThread->terminate();
}

void MainWindow::UpdateSlot(int num)
{
showNum->setText(QString::number(num));
}

void MainWindow::ClearSlot()
{
emit ResetSignal();
}

MainWindow::~MainWindow()
{

}

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐