c++ - 从不同线程创建 QMainWindow

标签 c++ multithreading qt widget pool

我尝试创建类似窗口池的东西。您可以在程序中的任何地方使用这些窗口来显示图形和绘图等。小部件运行良好,但目前的主要问题是创建池的尝试受挫。一个非 QObject-Object 应该表示一个 QMainWindow 以切断与 Qt 的绑定(bind)。

我无法创建小部件 -> 我尝试了 invokeMethode、connect 和 QTimer,但没有任何效果。有时方法不会被调用,或者我不在 gui 线程中……有什么想法吗?

编辑 2 - 新版本:

标题:

#pragma once
#include <QMainWindow>
#include <QTimer>

class MyWindow : QObject
{
  Q_OBJECT
public:
  MyWindow();
};

class QWindowPool : public QObject
{
  Q_OBJECT
 public:
   QWindowPool();
 public slots:
  void createWindow();  
};

class QWindow : public QMainWindow
{
  Q_OBJECT
};

CPP: #包括

#include <QApplication>
#include <QTimer>
#include <QtConcurrent/qtconcurrentrun.h>

#include <iostream>
#include <future>

static QWindowPool *pool = new QWindowPool();

QWindowPool::QWindowPool() {

  // check if app is running
  if (!QApplication::instance()) {
    bool appOnline = false;
    QtConcurrent::run([&appOnline](){
      int c = 0;
      new QApplication(c, NULL);
      appOnline = true;
      qApp->exec();
    });
    while (!appOnline) {}
  }
  moveToThread(QApplication::instance()->thread());
}

void QWindowPool::createWindow() {
  printf("window created\n");
  new QWindow();
}

MyWindow::MyWindow() {
  QTimer::singleShot(0, pool, SLOT(createWindow()));
}

int main()
{
  MyWindow mw;
  std::thread t1([](){
    MyWindow mw;

    std::thread t2([](){
      MyWindow mw;
    });

    t2.join();
  });
  t1.join();

  std::cin.ignore();
  return 0;
}

现在代码做了应该做的事。我可以在不同的线程中创建小部件。但是有两种情况,我会堆叠在:

  • 有人(任何想使用这个库的人)在我之前创建 QApplication 并且从不调用 qApp->exec

  • 有人想用 Widget 创建自己的 UI,但在我的 qt::concurrent gui 线程中不起作用。他可能不会接受这一点。

我想要的是在最终的应用程序中: 用户应该有可能在他的代码和任何线程中的任何地方编写:

MyWindow mw(dataToDisplay)

应该创建窗口并显示给他。

最佳答案

Qt 将只允许您从主 GUI 线程创建小部件,这在文档中明确提到(强调我的):

As mentioned, each program has one thread when it is started. This thread is called the "main thread" (also known as the "GUI thread" in Qt applications). The Qt GUI must run in this thread. All widgets and several related classes, for example QPixmap, don't work in secondary threads. A secondary thread is commonly referred to as a "worker thread" because it is used to offload processing work from the main thread.

关于c++ - 从不同线程创建 QMainWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28602040/

相关文章:

c++ - 将 .open 与 ifsteam 对象一起使用时出现问题

c++ - 如何在一个函数中拥有所有选项?

c++ - 使用 scanf 时出错

c++ - 如何将表示指数形式的十进制数的字符串转换为 Qt 中的 float ?

c++ - 错误 C2893 函数模板专用化失败 'unknown-type std::invoke(_Callable &&,_Types &&...)'

c++ - 一个线程提供数据,多个线程消耗数据的最快实现

c# - .Net Garbage 会收集一个未被引用但有一个正在工作的线程的对象吗?

python - 如何为不同Python进程之间的不同神经网络设置共享权重?

qt - 更改资源(如图标)不会重新编译 .qrc 文件

c++ - 如何启动一个在应用程序退出时不关闭的线程? (Qt C++)