QML弹出窗口与C ++应用程序无法正常工作

时间:2017-05-02 11:01:18

标签: qt popup qml qtquickcontrols2

我在Qt中有一个应用程序,我可以在c ++应用程序和QML应用程序之间切换(将中央窗口小部件设置为一个或另一个)。

问题是,为了解决这个问题,我不得不将main.qml从ApplicationWindow更改为Page,现在我的QML应用程序中的Dialogs和所有弹出窗口都无法正常工作(模态和焦点根本不起作用)。

我的代码看起来像这样:

QQuickWidget *view = new QQuickWidget(this);
view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));  //Page

MyCppApp *myCppApp = new MyCppApp (this);  //QWidget

QStackedWidget *stackedWidget = new QStackedWidget;
stackedWidget->addWidget(view);
stackedWidget->addWidget(myCppApp);
stackedWidget->setCurrentIndex(1);

setCentralWidget(stackedWidget);

我知道在Popup的文档中有"它可以与Window或ApplicationWindow一起使用。"但有没有办法让我的QML中的Popups正常工作?

我正在使用Qt 5.8和Qt Quick Controls 2。

1 个答案:

答案 0 :(得分:0)

对于模态,你不应该在主窗口中使对话框窗口成为中央窗口小部件的一部分(否则它是模态的相对于什么?)。从主窗口调用它。为了给它模态对话框的外观和行为,你可以应用这样的窗口标志:

// this view is not a part of the app main window
view->setFlags(Qt::Dialog | Qt::WindowTitleHint |
                     Qt::WindowStaysOnTopHint  | Qt::MSWindowsFixedSizeDialogHint);

请注意Qt::MSWindowsFixedSizeDialogHint当然仅适用于Windows。并设置焦点:

// to set the edit focus such trick needed
QTimer::singleShot(0, view, SLOT(setFocus()));

我将它用于QML小部件容器。实施细节可能有所不同并且没有可见的QML部分。那时你可能需要照顾FocusScope