我在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。
答案 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。