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

时间:2017-07-26 14:04:29

标签: qt dialog qml qtquick2

如何将import QtQuick.Dialogs的对话框设为非原生,非QDialog派生的对象(QFileDialog等)?

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

1 个答案:

答案 0 :(得分:2)

更改此

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的实现将是一个平台文件对话框if   可能。如果这不可能,那么它将尝试实例化a   QFileDialog。如果这也不可能,那么它将回归到   QML实现,DefaultFileDialog.qml。在那种情况下你可以   通过编辑此文件来自定义外观。 DefaultFileDialog.qml   包含一个Rectangle来保存对话框的内容,因为确定   嵌入式系统不支持多个顶级窗口。当。。。的时候   对话框变为可见,它将自动包装在一个窗口中   如果可能的话,或者只是在主窗口的顶部重新设置   只能是一个窗口。