当 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 的最简单方法