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

Posted

技术标签:

【中文标题】当 MainWindow 从另一个类(不在主函数中)启动时,QT ui 未显示【英文标题】:QT ui not showing up when MainWindow initated from another class (not in the main function) 【发布时间】:2017-12-31 12:41:32 【问题描述】:

是否可以在 QT 中初始化 MainWindow 的对象并从另一个类调用 show 方法,例如在线程类构造函数中,然后在 main 函数中创建线程对象并启动线程?它对我不起作用(用户界面闪烁并立即消失)。有什么办法可以解决吗?如果没有,我怎样才能控制线程中的按钮和其他东西。如何通过交换数据在它们(线程和 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();

【问题讨论】:

尝试将MainWindow m; m.show();更改为MainWindow *m = new MainWindow; m->show(); 【参考方案1】:

您可以这样做,但在此之前您必须将 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();


将你的线程连接到主窗口

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

使用emit mySignal();从你的线程调用槽

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

【讨论】:

connect(threadObject, &Thread::mySignal, this, &MainWindow::ShowWindow());connect(threadObject, &Thread::mySignal, this, &MainWindow::ShowWindow);,是错字吗? @eyllanesc 你是对的,应该是&MainWindow::ShowWindow。我已经更正了。 我认为是因为在函数中创建的对象只存在于该函数中,最终被淘汰。您是否测试过您的解决方案? 你的代码:void MainWindow::ShowWindow() MainWindow m; m.show(); ,好像没必要,void MainWindow::ShowWindow() show(); @eyllanesc 当我写下答案时,我知道他的对象超出了范围。我什至没有提到它,因为从你的线程在堆上分配主窗口是错误的。正确的方法是使用小部件应用程序并使用从线程到 gui 线程的信号和插槽。

以上是关于当 MainWindow 从另一个类(不在主函数中)启动时,QT ui 未显示的主要内容,如果未能解决你的问题,请参考以下文章

Qt GUI 从另一个类访问 MainWindow 的最简单方法

如何从另一个 Qt Widget 表单类调用 MainWindow 类

从另一个类发出信号

qt自定义的函数怎么调用mainwindow

如何从另一个页面更改页面标签?

连接主窗口类外的插槽