在 ToolBar 中使用 QML FileDialog 导致 "Binding loop"

Using QML FileDialog leads to "Binding loop" in ToolBar

我有一个我自己无法解决的问题。我使用这个第三方 library/framework - https://github.com/papyros/qml-material 开发了一个 UI。它具有根据 Google 指南开发的控件和布局。问题是当我在项目中使用 FileDialog 时,它定义的页面加载缓慢并且我收到以下消息:

file:///C:/.../QtQuick/Controls/ToolBar.qml:146:9: QML QQuickItem*: Binding loop detected for property "layoutHeight"
file:///C:/.../QtQuick/Dialogs/DefaultFileDialog.qml:407:9: QML ToolBar: Binding loop detected for property "implicitHeight"
file:///C:/.../QtQuick/Dialogs/DefaultFileDialog.qml:407:9: QML ToolBar: Binding loop detected for property "implicitHeight"

如果有人知道答案就好了。

使用库的 GitHub 项目中的演示可以很容易地重现该问题 - https://github.com/papyros/qml-material/tree/develop/demo。只需在某处添加 FileDialog,然后查看页面将如何加载以及您将收到什么消息。

使用的Qt版本:5.12.6

FileDialog 放入设置为 asynchronous 加载的 Loader 时,这是一个有点已知的问题。这是演示问题的完整示例:

import QtQuick.Window 2.12
import QtQuick.Dialogs 1.3

Window {
    id: root
    visible: true
    width: 640
    height: 480

    Loader {
        sourceComponent: FileDialog {}
        asynchronous: true // change to false and ToolBar binding loop goes away
    }
}

我注意到您引用的项目在 main.qml 中使用了异步加载程序,因此看来这是导致您出现问题的原因。参见第 243 行:

                Loader {
                    id: example
                    anchors.fill: parent
                    asynchronous: true

我找到了one bug report but it has been closed as unresolved. My understanding of this problem is that the error only affects the "backup" QFileDialog that only appears if an OS-specific one is not available. From the documentation:

The implementation of FileDialog will be a platform file dialog if possible. If that isn't possible, then it will try to instantiate a QFileDialog.

根据我的经验,在 Windows 和 Mac 上,绑定循环错误不会导致任何问题并且可以忽略,因为 OS 文件对话框总是出现。除了不使用 asynchronous 标志之外,我也不认为这是一个可纠正的错误,因为它是一个 Qt 错误。