【问题标题】:Why is my QML code loading FileDialog from Qt.labs although I imported QtQuick.Dialogs?为什么我的 QML 代码从 Qt.labs 加载 FileDialog,尽管我导入了 QtQuick.Dialogs?
【发布时间】:2026-02-24 16:25:01
【问题描述】:

我在我的一个 QML 文件中使用了据称来自 QtQuick.Dialogs 的 FileDialog。但是,当我在 QtCreator 中打开上下文帮助时,它向我显示了 Qt Labs 的 FileDialog 条目,而不是 Qt Quick Dialogs 中的条目。我在我的项目中没有提到 Qt Labs。为什么它不使用我告诉它的 FileDialog?

我在 Ubuntu 18.04 上使用 QtCreator 4.6.2 和 Qt 5.11.1。

以下是相关代码sn-ps:

LoadFileDialog.qml:

import QtQuick 2.9
import QtQuick.Dialogs 1.3

FileDialog {
   id: loadFile

   folder: "."
   selectExisting: true
   selectMultiple: false

   title: "Please select file to load"

   onAccepted: {
     //[...]
   }

   onRejected: {
     //[...]
   }
}

*.pro 文件中的导入语句:

QT += qml quick gui widgets
CONFIG += c++11

该应用程序在我的 Ubuntu 18.04 系统上运行良好,从使用 Qt 5.11.1 的 QtCreator 以及使用系统的 Qt 5.9 独立运行。一旦我尝试在带有 Qt 5.12 的 Ubuntu 20.04 系统上运行它,它就会抱怨找不到 FileDialog。我也不知道缺少什么库才能使其正常工作。

编辑:我尝试在 Ubuntu 20.04 中运行应用程序时得到的输出是:

qt5ct: using qt5ct plugin
QQmlApplicationEngine failed to load component
qrc:/main.qml:193 Type LoadFileDialog unavailable
qrc:/LoadFileDialog.qml:4 Type FileDialog unavailable
file:///usr/lib/x86_64-linux-gnu/qt5/qml/QtQuick/Dialogs/DefaultFileDialog.qml:47 module "Qt.labs.folderlistmodel" is not installed

谢谢。

【问题讨论】:

  • 帮助类型错误的问题可能只是 Creator 的问题,与您的问题无关。在 Ubuntu 20.04 上运行应用程序时遇到的实际错误是什么?
  • 添加到原始问题。
  • 所以,同时我发现20.04系统上缺少的包是qml-module-qt-labs-folderlistmodel,因为这似乎实际上是在QtQuick的DefaultFileDialog.qml中导入的。事实证明,在我不知道的 yubikey-manager-qt 安装过程中,它已自动安装在我的 18.04 系统上。尽管如此,两个系统上的文件对话框看起来明显不同,在 20.04 上,它与标准窗口管理器的文件对话框完全不同。
  • 这意味着,无论出于何种原因,它决定使用非本机回退对话框。我不记得决定这一点的逻辑在哪里,但这里描述了这个过程:doc.qt.io/qt-5/qml-qtquick-dialogs-filedialog.html 具体来说,以“如果可能的话,FileDialog 的实现将是一个平台文件对话框”开头的部分。
  • 如果您更喜欢(作为一种希望的临时解决方法)它使用 QFileDialog(又名小部件对话框)而不是 QML 对话框,请确保您的应用程序对象是 QApplication 而不是 QGuiApplication。检查是否可以使用本机对话框的逻辑在这里:code.qt.io/cgit/qt/qtquickcontrols.git/tree/src/dialogs/…

标签: qt qml qtquick2


【解决方案1】:

你已经弄清楚了你原来的问题,所以我会尝试回答第二个问题。

选择哪种对话类型的逻辑在here中描述:

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

This 代码是确定是否使用本机文件对话框的逻辑的一部分。 This 函数是另一部分。因此,为了确保您获得本机文件对话框,您显然需要 GTK3 3.15.5 或更高版本。如果失败,它将退回到小部件对话框。为此,您的应用程序对象也应该是一个 QApplication。最后,QML 对话框将用作最终的后备。

【讨论】:

  • 谢谢。更改为 QApplication 确实会更改 20.04 系统上的对话框,但仍不会更改为原生对话框。我在 18.04 系统上有 GTK3 3.22.30,在 20.04 系统上有 GTK3 3.24.20,所以不能单独使用。但是现在这完全足够了,至少应用程序正在运行。
最近更新 更多