如果我将QQuickView-WindowContainer设置为中央小部件,应用程序不会关闭

时间:2014-02-12 10:39:06

标签: qt qml qwidget qt-quick qtquick2

我的应用程序的设计方式是,不同的插件可以设置主窗口的中央窗口小部件以显示所需的内容。

到目前为止这是有效的。

但是如果我将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();
}

1 个答案:

答案 0 :(得分:1)

这看起来像个错误。我在调试器中看到一个死锁:v8::internal::RuntimeProfiler::WaitForSomeIsolateToEnterJSQQmlDataLoader::shutdownThread等待对方。我找不到这个问题的好方法。

我发现了一个解决问题的肮脏黑客。如果稍早删除container,则一切正常:

void MainWindow::closeEvent(QCloseEvent *e) {
  QMainWindow::closeEvent(e);
  if (e->isAccepted() && centralWidget()) {
    delete centralWidget();
  }
}

您可能应该发送错误报告。请注意,重现问题不需要m_mainWindow。使用container->show();会得到相同的结果。