【问题标题】:QT ui not showing up when MainWindow initated from another class (not in the main function)当 MainWindow 从另一个类(不在主函数中)启动时,QT ui 未显示
【发布时间】: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();

标签: c++ qt qthread


【解决方案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 线程的信号和插槽。
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多