【发布时间】:2015-02-19 08:55:14
【问题描述】:
我尝试创建类似窗口池的东西。您可以在程序中的任何地方使用这些窗口来显示图形和绘图等。小部件运行良好,但目前的主要问题是创建池的失败尝试。一个非 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 <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)
并且应该创建窗口并向他显示。
【问题讨论】:
标签: c++ multithreading qt widget pool