先创建ui界面,如下图:
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void starting(int num);
private:
Ui::MainWindow *ui;
};
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//1.创建子线程对象
Generate* gen = new Generate();
connect(this,&MainWindow::starting,gen,&Generate::recvNum); //使用信号和槽机制将随机数的个数发送到gen
//2.启动子线程
connect(ui->start,&QPushButton::clicked,this,[=]()
{
emit starting(10000); //发送随机数的个数
gen->start();
});
//接收子线程发送的数据,接收类型是Generate::sendArray的参数类型QVector<int>
connect(gen,&Generate::sendArray,this,[=](QVector<int> list)
{
for(int i=0;i<list.size();i++)
{
ui->randlist->addItem(QString::number(list.at(i)));
}
});
}
MainWindow::~MainWindow()
{
delete ui;
}
mythread.h
#include <QThread>
#include <QVector>
//创建MyThread类,父类选择QObject,创建后将QObject父类修改为QThread
//生成随机数 按照该类名称将MyTread类名修改为Generate
class Generate : public QThread
{
Q_OBJECT
public:
explicit Generate(QObject *parent = nullptr);
void recvNum(int num); //槽函数,用作设置随机数的个数m_num
protected:
void run() override;
signals:
//生成的随机数要发送到ui线程(主线程)中,就需要信号传出去
//随机数是QVector<int>类型,所以这个信号的参数也是QVector<int>类型
void sendArray(QVector<int> num);
public slots:
private:
int m_num;
};
mythread.cpp
#include "mythread.h"
#include <QElapsedTimer>
#include <QDebug>
Generate::Generate(QObject *parent) : QThread(parent)
{
}
void Generate::recvNum(int num)
{
m_num=num;
}
void Generate::run()
{
qDebug()<<"生成随机数的线程的线程地址:"<<QThread::currentThreadId();
QVector<int> list;
QElapsedTimer timer; //用来记录某个流程执行所用的时间,从start()开始计时,elapsed()返回执行所需的时间(ms)
timer.start();
for(int i=0;i<m_num;i++)
{
list.push_back(qrand()%10000); //产生10000以内的随机数
}
int milsec=timer.elapsed();
qDebug()<<"生成"<<m_num<<"个随机数总共用时:"<<milsec<<"毫秒";
emit sendArray(list); //将list使用信号函数传出去
}
运行之后,显示界面如下:
点击“开始”,界面没有任何反应,查看应用程序输出显示:
提示connect不支持'QVector<int>'类型,确保使用qRegisterMetaType()进行注册。也就是在MainWindow中connect连接Generate::sendArray信号到MainWindow槽时的传参使用QVector<int>类型没有注册。
qRegisterMetaType()是一个模板函数,需要再main函数QApplication()下面添加指定支持类型的模板函数,譬如需要支持'QVector<int>'类型,添加两处:
- 在qRegisterMetaType后紧接加一个<>,里面写QVector<int>类型;
- 括号里面写"QVector<int>":
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qRegisterMetaType<QVector<int>>("QVector<int>");
MainWindow w;
w.show();
return a.exec();
}
以上多线程生成随机数就完成了;