一、创建对象,要继承Qbject
TableItem.h
#pragma once
#include <QObject>
#include <QTableWidget>
#include <QThread>
#include <QDebug>
class TableItem : public QObject
{
Q_OBJECT
public:
TableItem(QObject *parent=nullptr);
~TableItem();
bool bFlag = false;
public slots:
//void SetTableItem(int row, int col, QString strText, QTableWidget* pTable);
void SetTableItem();
};
TableItem.cpp
#include "TableItem.h"
#pragma execution_character_set("utf-8")
TableItem::TableItem(QObject *parent)
: QObject(parent)
{
}
TableItem::~TableItem()
{
}
void TableItem::SetTableItem(/*int row, int col, QString strText, QTableWidget* pTable*/)
{
while (1)
{
qDebug() << "子线程ID:" << QThread::currentThreadId();
if (bFlag)
{
break;
}
}
bFlag = false;
}
ThreadDemo.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_ThreadDemo.h"
#include <QThread>
#include "TableItem.h"
#include <QDebug>
class ThreadDemo : public QWidget
{
Q_OBJECT
public:
ThreadDemo(QWidget *parent = Q_NULLPTR);
void initUI();
private:
Ui::ThreadDemoClass ui;
QThread* m_pThread = nullptr;
TableItem* m_pTableItem = nullptr;
public slots:
void on_pushButton_clicked();
void on_pushButtonStop_clicked();
signals:
void startThreadSignal(/*int& row, int& col, QString& strText, QTableWidget* pTable*/);
};
ThreadDemo.cpp
#include "ThreadDemo.h"
#pragma execution_character_set("utf-8")
ThreadDemo::ThreadDemo(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
initUI();
m_pThread = new QThread(this);
m_pTableItem = new TableItem;//不能指定父对象且禁止在线程对象中操作UI
m_pTableItem->moveToThread(m_pThread);
bool b = connect(this, &ThreadDemo::startThreadSignal, m_pTableItem, &TableItem::SetTableItem);
int a = 0;
}
void ThreadDemo::initUI()
{
QStringList listHeader;
ui.tableWidget->setColumnCount(2);
listHeader << "数量" << "价格";
ui.tableWidget->setHorizontalHeaderLabels(listHeader);
}
void ThreadDemo::on_pushButton_clicked()
{
//开启线程,但没有开启线程函数,需要通过信号的方式去开启线程函数
qDebug() << "主线程ID:" << QThread::currentThreadId();
m_pThread->start();
emit startThreadSignal(/*nRow,nCol, QString("2222"), ui.tableWidget*/);
}
void ThreadDemo::on_pushButtonStop_clicked()
{
m_pTableItem->bFlag = true;
m_pThread->quit();
m_pThread->wait();
}
main函数
#include "ThreadDemo.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ThreadDemo w;
w.show();
return a.exec();
}