如何在不同的 QT 线程中创建窗口?

How do I create a Window in different QT threads?(如何在不同的 QT 线程中创建窗口?)
本文介绍了如何在不同的 QT 线程中创建窗口?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我有一个应用程序,其中每个线程(主线程除外)都需要创建自己的窗口.我尝试创建一个线程,然后在 run 函数中调用 this->exec() .但是,我什至在调用之前收到一个错误:ASSERT 在 QWidget 中失败:Widgets must be created in the GUI thread."

I have an application in which each thread (except the main thread) needs to create its own window. I tried creating a thread and then calling this->exec() in the run function. However, I get an error before I even get to that call: ASSERT failure in QWidget: "Widgets must be created in the GUI thread."

我想弹出一个消息窗口.问题是源有多个线程,每个线程可能需要弹出自己的消息.

I want to popup a message window. The problem is that the source has multiple threads each of which may need to popup its own message.

推荐答案

如果你需要在不同的(非主)线程中创建 QWidget(或其他一些 gui 组件),你可以在这样的线程中实现它方式:

If you need to create QWidget(or some other gui component(s)) in different(non-main) thread(s) you can implement it in such way:

  • 创建包含 gui 组件的简单包装器:

  • Create simple wrapper which holds gui component:

// gui component holder which will be moved to main thread
class gui_launcher : public QObject
{
  QWidget *w;
  // other components
  //..
public:
  virtual bool event( QEvent *ev )
  {   
    if( ev->type() == QEvent::User )
    {
      w = new QWidget;
      w->show();
      return true;
    }
    return false;
  }
};

  • 在主线程中创建QApplication对象

  • create QApplication object in main thread

    另一个线程主体:

    ..
      // create holder
      gui_launcher gl;
      // move it to main thread
      gl.moveToThread( QApplication::instance()->thread() );
      // send it event which will be posted from main thread
      QCoreApplication::postEvent( &gl, new QEvent( QEvent::User ) );
    ..
    

  • 开心点,:)

  • be happy, :)

    这篇关于如何在不同的 QT 线程中创建窗口?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

    本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!
  • 相关文档推荐

    Unresolved external symbol quot;public: virtual struct QMetaObject const * __thiscall Parent(未解析的外部符号“public: virtual struct QMetaObject const * __thiscall Parent)
    QVector vs QList(QVector 与 QList)
    How to create/read/write JSON files in Qt5(如何在 Qt5 中创建/读取/写入 JSON 文件)
    Qt: How do I handle the event of the user pressing the #39;X#39; (close) button?(Qt:如何处理用户按下“X(关闭)按钮的事件?)
    STL or Qt containers?(STL 还是 Qt 容器?)
    Sort filenames naturally with Qt(使用 Qt 自然地对文件名进行排序)