我尝试创建类似窗口池的东西。您可以在程序中的任何位置使用这些窗口来显示图形和绘图等。窗口小部件运行良好但目前的主要问题是创建池的沮丧尝试。一个非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)
并且应该创建窗口并向他展示。
答案 0 :(得分:1)
Qt只允许你从主GUI线程创建小部件,这在文档中明确提到(强调我的):
如上所述,每个程序在启动时都有一个线程。这个 线程被称为&#34;主线程&#34; (也称为&#34; GUI线程&#34; in Qt应用程序)。 Qt GUI必须在此线程中运行。所有小部件和 几个相关的课程,例如QPixmap,不在中学工作 线程。辅助线程通常被称为&#34;工作者 螺纹&#34;因为它用于从主要卸载处理工作 线程。