我的应用程序的设计方式是,不同的插件可以设置主窗口的中央窗口小部件以显示所需的内容。
到目前为止这是有效的。
但是如果我将QQuickView-WindowContainer设置为中央窗口小部件,则关闭主窗口时应用程序不会退出。
如果我将像QPushButton这样的“普通”小部件设置为中央小部件,那么应用就可以了。那是为什么?
这是显示此行为的最小示例的代码(MainWindow是从QtCreator向导创建的类):
class AppCore : public QObject
{
Q_OBJECT
public:
explicit AppCore(QObject *parent = 0);
signals:
public slots:
void showMainWindow();
private:
MainWindow *m_mainWindow;
};
AppCore::AppCore(QObject *parent) :
QObject(parent)
{
}
void AppCore::showMainWindow()
{
QQuickView *view;
QWidget *container;
view = new QQuickView();
container = QWidget::createWindowContainer(view);
view->setSource(QUrl("qrc:/main.qml"));
m_mainWindow = new MainWindow();
//m_mainWindow->setCentralWidget(new QPushButton("Button"));
m_mainWindow->setCentralWidget(container);
m_mainWindow->show();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
AppCore appCore;
appCore.showMainWindow();;
return a.exec();
}
答案 0 :(得分:1)
这看起来像个错误。我在调试器中看到一个死锁:v8::internal::RuntimeProfiler::WaitForSomeIsolateToEnterJS
和QQmlDataLoader::shutdownThread
等待对方。我找不到这个问题的好方法。
我发现了一个解决问题的肮脏黑客。如果稍早删除container
,则一切正常:
void MainWindow::closeEvent(QCloseEvent *e) {
QMainWindow::closeEvent(e);
if (e->isAccepted() && centralWidget()) {
delete centralWidget();
}
}
您可能应该发送错误报告。请注意,重现问题不需要m_mainWindow
。使用container->show();
会得到相同的结果。