QT从入门到入土(五(1))——多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com)
#include "workthread.h"
#include <QDebug>
work2()
{
qDebug() << "work2():" << QThread::currentThreadId();
QThread::sleep(5);
}
workThread::workThread(QObject *parent) : QThread(parent)
{
}
void workThread::work1()
{
qDebug() << "work1():" << QThread::currentThreadId();
QThread::sleep(5);
}
void workThread::run()
{
qDebug() << "当前子线程ID:" << QThread::currentThreadId();
QThread::sleep(10);
work1();
work2();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
thread=new workThread(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
qDebug() << "主线程id:" << QThread::currentThreadId();
thread->start();
}
主线程id: 0x512c
当前子线程ID: 0x4ef0
work1(): 0x4ef0
work2(): 0x4ef0
说明run(),work1()和work2()都是在子线程中执行的。
void workThread::run()
{
QString path = QApplication::applicationDirPath();
QString fileName = QFileDialog::getOpenFileName(nullptr, QString::fromLocal8Bit("选择excel文件"), path, QString::fromLocal8Bit("Excel Files(*.xls *.xlsx)")); //设置保存的文件名
}
错误写法!
ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel\qwidget.cpp, line 1146
子线程中不能使用QWidget相关的窗体。