从不同的线程创建QMainWindow

时间:2015-02-19 08:55:14

标签: c++ multithreading qt widget pool

我尝试创建类似窗口池的东西。您可以在程序中的任何位置使用这些窗口来显示图形和绘图等。窗口小部件运行良好但目前的主要问题是创建池的沮丧尝试。一个非QObject-Object应该代表一个QMainWindow来剪切绑定到Qt。

我无法创建小部件 - >我尝试了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

#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-&gt; exec

  • 有人想用Widget创建一个自己的UI但在我的qt :: concurrent gui线程中不起作用。他可能不会与此相处。

我想要的是最终申请: 用户应该可以在他的代码和任何线程中的任何地方写入:

MyWindow mw(dataToDisplay)

并且应该创建窗口并向他展示。

1 个答案:

答案 0 :(得分:1)

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

  

如上所述,每个程序在启动时都有一个线程。这个   线程被称为&#34;主线程&#34; (也称为&#34; GUI线程&#34; in   Qt应用程序)。 Qt GUI必须在此线程中运行。所有小部件和   几个相关的课程,例如QPixmap,不在中学工作   线程。辅助线程通常被称为&#34;工作者   螺纹&#34;因为它用于从主要卸载处理工作   线程。