小实践
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
// #pragma once
#include <QMainWindow>
#include"zthread.h"QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass ZThread;class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void onEmitSignalUpdate(int num);private:Ui::MainWindow *ui;ZThread* m_pThtread;
};
#endif // MAINWINDOW_H
zthread.h
// #pragma once
#ifndef ZTHREAD_H
#define ZTHREAD_H
#include<QObject>
#include<QThread>
#include<QDebug>// QObject
class ZThread : public QThread
{Q_OBJECT
public:explicit ZThread(QObject *parent = nullptr);~ZThread();void stopthreadrunning();signals:void updateThreadsignal(int num);protected:void run();private:bool m_bRunning; //控制多线程运行。b是布尔类型int m_ncount; //n是number类型
};#endif // ZTHREAD_H
main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
// #include "zthread.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);m_pThtread=new ZThread();m_pThtread->start();connect(m_pThtread,&ZThread::updateThreadsignal,this,&MainWindow::onEmitSignalUpdate);// connect(m_pThtread,SIGNAL(updateThreadsignal(int)),this,SLOT(onEmitsignalupdate(int))); //这样的写法也可以
}MainWindow::~MainWindow()
{if(m_pThtread!=nullptr){m_pThtread->stopthreadrunning();m_pThtread->quit();m_pThtread->wait();m_pThtread->deleteLater();}delete ui;
}void MainWindow::on_pushButton_clicked()
{m_pThtread->stopthreadrunning();
}void MainWindow::onEmitSignalUpdate(int num)
{qDebug()<<"==========Thread Signal Update"<<num<<Qt::endl;
}
zthread.cpp
#include "zthread.h"ZThread::ZThread(QObject *parent): QThread{parent},m_bRunning(true),m_ncount(0)
{}ZThread::~ZThread()
{}void ZThread::run() //The threaded code runs in this
{while(m_bRunning) //The code that all threads run on is written here{// qDebug()<<"T is running......"<<Qt::endl;++m_ncount;emit updateThreadsignal(m_ncount);msleep(1000); //Milliseconds}qDebug()<<"=====T is exit====="<<Qt::endl;
}void ZThread::stopthreadrunning()
{m_bRunning=false;
}
界面:
运行结果:
】
心得
我好像明白了点,我确实语法错了。之前关联信号与槽的时候,明明是不同的两个类,我却在connect前边加上了一个类域,这是其一;信号函数没有函数体定义,不能在.cpp文件中实现,但是我却实现了,还加了类域
没想到 重定义 三个字放到信号signals这里是这样的情况,我粗略地以为只是函数、变量对象等的“重定义、”
connect(m_pThtread,&ZThread::updateThreadsignal,this,&MainWindow::onEmitSignalUpdate); 函数指针的写法也可以了
注意不要犯错: