2

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

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

我的代码如下所示:

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 中的弹出窗口正常工作?

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

4

1 回答 1

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

于 2017-05-03T03:48:56.123 回答