政府網(wǎng)站建設(shè)公司 政務(wù)qq推廣引流網(wǎng)站
說明:復(fù)現(xiàn)的代碼來自《Qt C++6.0》P496-P500。在復(fù)現(xiàn)時完全按照代碼,出現(xiàn)了兩處報錯:
(1)ui指針(2)按鈕的響應(yīng)函數(shù)。下面程序?qū)σ陨蠁栴}進行了修改。除了圖片、清空、關(guān)閉功能外,其他功能實現(xiàn)復(fù)現(xiàn)。
主線程:
.h文件
#pragma once#include <QtWidgets/QMainWindow>
#include "ui_ThreadTest_one.h"
#include "QtClass.h"class ThreadTest_one : public QMainWindow//主線程
{Q_OBJECTprivate:QtClass* threadA;protected:void closeEvent(QCloseEvent* event);public:ThreadTest_one(QWidget* parent = nullptr);~ThreadTest_one();private:Ui::ThreadTest_oneClass ui;public slots:void do_threadA_started();void do_threadA_finished();void do_threadA_newValue(int seq, int diceValue);void on_actThread_Run_clicked();void on_actDice_Run_clicked();void on_actThread_Quit_clicked();void on_actDict_Pause_clicked();
};
.cpp文件
#include "ThreadTest_one.h"
#include <QCloseEvent>
#include <QThread>ThreadTest_one::ThreadTest_one(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);threadA = new QtClass(this);//創(chuàng)建工作線程connect(threadA, &QtClass::started, this, &ThreadTest_one::do_threadA_started);connect(threadA, &QtClass::finished, this, &ThreadTest_one::do_threadA_finished);connect(threadA, &QtClass::newValue, this, &ThreadTest_one::do_threadA_newValue);
}void ThreadTest_one::do_threadA_started() {ui.statusBar->showMessage("Thread狀態(tài):thread start");ui.actThread_Run->setEnabled(false);ui.actThread_Quit->setEnabled(true);ui.actDice_Run->setEnabled(true);}
void ThreadTest_one::do_threadA_finished() {ui.statusBar->showMessage("Thread狀態(tài):thread finished");ui.actThread_Run->setEnabled(true);ui.actThread_Quit->setEnabled(false);ui.actDice_Run->setEnabled(false);ui.actDict_Pause->setEnabled(false);
}void ThreadTest_one::do_threadA_newValue(int seq, int diceValue) {//與線程的newValue()信號相關(guān)聯(lián)QString str = QString::asprintf("第%d次投骰子,點數(shù)為%d", seq, diceValue);ui.plainTextEdit->appendPlainText(str);}//按鍵的槽函數(shù)
void ThreadTest_one::on_actThread_Run_clicked() {//要用clicked才能得到響應(yīng)threadA->start();
}
void ThreadTest_one::on_actThread_Quit_clicked() {threadA->stopThread();
}
void ThreadTest_one::on_actDice_Run_clicked() {threadA->diceBegin();ui.actDice_Run->setEnabled(false);ui.actDict_Pause->setEnabled(true);
}
void ThreadTest_one::on_actDict_Pause_clicked() {threadA->dicePause();ui.actThread_Run->setEnabled(true);ui.actDict_Pause->setEnabled(false);
}//重定義事件處理函數(shù),確保窗口關(guān)閉時線程被停止
void ThreadTest_one::closeEvent(QCloseEvent* event) {if (threadA->isRunning()) {threadA->terminate();threadA->wait();}event->accept();
}ThreadTest_one::~ThreadTest_one()
{}
工作線程:
.h文件
#pragma once#include <QThread>class QtClass : public QThread
{Q_OBJECTpublic:QtClass(QObject *parent);~QtClass();
private:int m_seq = 0; //擲骰子次數(shù)的序號int m_diceValue;//骰子的點數(shù)bool m_paused = true;//暫停投骰子bool m_stop = false;//停止線程protected:void run();//線程的任務(wù)public:void diceBegin();//開始擲骰子void dicePause();//暫停投骰子void stopThread();//停止線程signals:void newValue(int seq, int diceValue);//產(chǎn)生新點數(shù)的信號};
.cpp文件
#include "QtClass.h"
#include<QRandomGenerator>
#include<QThread>QtClass::QtClass(QObject *parent): QThread(parent)
{}
void QtClass::diceBegin() {//開始擲骰子m_paused = false;
}
void QtClass::dicePause() {//停止擲骰子m_paused = true;
}
void QtClass::stopThread() {//停止線程m_stop = true;
}
void QtClass::run() {//run函數(shù)處理事件循環(huán)m_stop = false;m_paused = true;m_seq = 0;while (!m_stop) {if (!m_paused) {m_diceValue = QRandomGenerator::global()->bounded(1, 7);m_seq++;emit newValue(m_seq, m_diceValue);}msleep(500);}quit();//退出線程
}
QtClass::~QtClass()
{}