Qt Quick 2 应用程序中的非本机对话框

Posted

技术标签:

【中文标题】Qt Quick 2 应用程序中的非本机对话框【英文标题】:Non-native Dialog in Qt Quick 2 application 【发布时间】:2017-07-26 14:04:29 【问题描述】:

如何使来自import QtQuick.Dialogs 的对话框成为非本地的、非QDialog 派生的(QFileDialog 等)?

可以将 QFileDialog 设为非本地 (QFileDialog::Option::DontUseNativeDialog)。但是如何使 QML 中的对话框以类似的方式在 xcb QPA 和 eglfs QPA 上呈现?

【问题讨论】:

【参考方案1】:

改变这个

QApplication app(argc, argv);

到这里

QGuiApplication app(argc, argv);

Dialog 有效,但对FileDialog 无效。它本质上告诉QtQuick.Dialogs您没有使用小部件,但它也会影响所使用的样式。

检查哪个应用程序正在使用的代码是here:

static QString defaultStyleName()

    //Only enable QStyle support when we are using QApplication
#if defined(QT_WIDGETS_LIB) && !defined(Q_OS_ios) && !defined(Q_OS_android) && !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_QNX) && !defined(Q_OS_WINRT)
    if (QCoreApplication::instance()->inherits("QApplication"))
        return QLatin1String("Desktop");
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
    if (QtAndroidPrivate::androidSdkVersion() >= 11)
        return QLatin1String("Android");
#elif defined(Q_OS_IOS)
    return QLatin1String("iOS");
#elif defined(Q_OS_WINRT) && 0 // Enable once style is ready
    return QLatin1String("WinRT");
#endif
    return QLatin1String("Base");

void QQuickAbstractDialog::setVisible(bool)) 似乎控制显示哪种类型的对话框。我不确定是否有办法使用公共 QML API 强制非本机对话框,但你总是可以修补 Qt:

diff --git a/src/dialogs/qquickabstractdialog.cpp b/src/dialogs/qquickabstractdialog.cpp
index ce87d56..416f796 100644
--- a/src/dialogs/qquickabstractdialog.cpp
+++ b/src/dialogs/qquickabstractdialog.cpp
@@ -81,7 +81,7 @@ void QQuickAbstractDialog::setVisible(bool v)
     if (m_visible == v) return;
     m_visible = v;

-    if (m_dialogHelperInUse || v) 
+    if (0 /*m_dialogHelperInUse || v*/) 
         // To show the dialog, we first check if there is a dialog helper that can be used
         // and that show succeeds given the current configuration. Otherwise we fall back
         // to use the pure QML version.

仅此补丁就足以强制使用 QML 对话框实现。

对于FileDialog,有this paragraph 说明过程:

FileDialog 的实现将是一个平台文件对话框,如果 可能的。如果那是不可能的,那么它将尝试实例化一个 QFileDialog。如果这也不可能,那么它将退回到 QML 实现,DefaultFileDialog.qml。在这种情况下,您可以 通过编辑此文件自定义外观。 DefaultFileDialog.qml 包含一个 Rectangle 来保存对话框的内容,因为某些 嵌入式系统不支持多个顶层窗口。当。。。的时候 对话框变得可见,它会自动被包裹在一个窗口中 如果可能的话,或者只是在主窗口顶部重新设置父级(如果有) 只能是一个窗口。

【讨论】:

我需要最新的后备。 我不能直接使用DefaultFileDialogQGuiApplication 什么都不做。 “最新的后备”? 我的意思是第三种情况,即不可能有以前的情况:If that also isn't possible, then it will fall back to a QML implementation, DefaultFileDialog.qml.。来自您的引用。 更新了答案。

以上是关于Qt Quick 2 应用程序中的非本机对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 windows xp 上部署 Qt 5.10 Quick 2 应用程序?

Qt Quick Controls 2 启动画面

qml 和 c++ 与 qt quick 2 应用程序

错误:QT 中的未知模块:qml quick - Qt Creator

项目错误:QT 中的未知模块:qml quick

qt-quick(qml) 应用程序无法订阅 ros 主题