当MainWindow从另一个类(不在主函数中)启动时,QT ui不显示

时间:2017-12-31 12:41:32

标签: c++ qt qthread

是否可以在QT中启动MainWindow的对象并从另一个类调用show方法,例如在线程类构造函数中,然后在main函数中创建线程对象并启动线程?它对我不起作用(ui闪烁并立即消失)。有什么办法可以解决吗?如果没有,我如何控制线程中的按钮和其他东西。如何通过交换数据在它们(线程和ui类)之间进行通信?

我的程序看起来像这样。线程构造函数:

#include "mainwindow.h"

void thread::thread(){
    MainWindow m;
    m.show();
}

和主要功能:

int main(int argc,char *argv[]){
    QApplication a(argc,argv);
    thread t;
    t.start();
    return a.exec();
}

1 个答案:

答案 0 :(得分:0)

您可以这样做,但在此之前您必须将MainWindow连接到线程对象。除了修改GUI的GUI线程函数之外,不应该从另一个线程调用。

解决方案是使用插槽/信号。从线程到UI的所有通信总是使用插槽和信号完成。

以下示例:

在Thread类中创建一个名为mySignal();

的信号
class Thread {

...

signals:
  void mySignal();

... 
}

并在MainWindow中创建一个插槽

class MainWindow {

...

public slots:
 void ShowWindow();

..

}

在MainWindow类中创建一个名为showWindow()

的函数
void MainWindow::ShowWindow() {

this->show();

}

将您的主题连接到MainWindow

connect(threadObject, &Thread::mySignal, this, &MainWindow::ShowWindow);

使用emit mySignal();

从您的主题中调用插槽

PS:您的应用程序应该是一个小部件应用程序而不是控制台。