qt主线程等待,从线程运行问题

#include
#include<process.h>
#include<Windows.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

static unsigned int __stdcall ThreadFun(void * pParam);

signals:
void sigPrint();
private slots:
void on_pushButton_clicked();
void slotPrint();

private:
Ui::MainWindow *ui;
};

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this, &MainWindow::sigPrint, this, &MainWindow::slotPrint);

}

MainWindow::~MainWindow()
{
delete ui;
}

unsigned int MainWindow::ThreadFun(void pParam)
{
MainWindow * po = (MainWindow
)pParam;
emit po->sigPrint();

qDebug()<<"emit";
return 0;

}

void MainWindow::on_pushButton_clicked()
{
HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, &MainWindow::ThreadFun, this, 0, nullptr);
SetThreadPriority(hThread, 2);
//QtConcurrent::run(this, &MainWindow::ThreadFun);
for(int i=0;i<5;i++)
{
QThread::msleep(1000);
}
qDebug()<<"on";
}

void MainWindow::slotPrint()
{
qDebug()<<"test";
}

运行的结果是
emit
on
test

connect参数改成Qt::BlockingQueuedConnection
运行结果是
on
test
emit

怎么才能输出test,emit,on

void sigPrint();信号写在mainwindows里了,相当于自己给自己发信号,没有任何意义。信号应该放在线程类中;
而且,在界面中调用sleep函数是大忌,不要这么搞。当然,这里只是测试的话就无所谓了。
我这里没有安装msvc+qt,所以没法测试代码的正确性,只提供一个思路。
(1)新建一个类MyThread,继承QThread类
(2)添加信号void sigPrint();和run函数;
MyThread.h文件:

#ifndef MYTHREAD_H
#define MYTHREAD_H


#include <QThread>
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
signals:
    void sigPrint();
private:
    void run();
};

#endif // MYTHREAD_H

MyThread.cpp文件

#include "mythread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
}

//也就是相当于把原来ThreadFun(void pParam)函数的信号发送部分移动到这里来了
void MyThread::run()
{
    emit sigPrint();
    sleep(1);//这里加个休眠,让主进程的槽函数先输出,休眠时间你自己调整一下
    qDebug()<<"emit";
}

这样在mainwindow中,只需要生成Mythread类的一个实例,然后调用就可以了。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mythread.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
public slots:

    void slotPrint();
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    MyThread* mthread;
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mthread = new MyThread();
    //mthread->setPriority(QThread::LowestPriority); //最低优先级,就2行代码,执行效率很快,这个优先级设置其实没多大用处
    connect(mthread, SIGNAL(sigPrint()), this, SLOT(slotPrint()));
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::slotPrint()
{
    qDebug()<<"test";
}

void MainWindow::on_pushButton_clicked()
{
    mthread->start();
    for(int i=0;i<5;i++)
    {
        QThread::msleep(1000);
    }
    qDebug()<<"on";
}