QML GroupBox:检测到属性“ implicitWidth”的绑定循环

时间:2018-07-17 16:32:42

标签: qt qml qt-quick

我正在尝试在QQuickWidget中加载一些QML表单,并不断获取:QML GroupBox: Binding loop detected for property "implicitWidth" 简化的QML是:

import QtQuick 2.4
import QtQuick.Controls 1.2

GroupBox {
    id: root
    title: qsTr("1")

    Column {
        id: column1
        width: parent.width

        ComboBox {
            id: cbComboBox
            width: parent.width
            currentIndex: 0
            editable: false
        }

        GroupBox {
            id: groupBox
            title: "test"
            width: parent.width //the problem
            Label {
                text:"1"
                width: parent.width
            }

        }
    }
}

由于某些原因,我无法将parent.widthcbComboBox.width用于groupBox。 root.width可以工作,但是范围太广。我缺少什么?我需要嵌套的GroupBox具有最大宽度(带有间距)。

1 个答案:

答案 0 :(得分:0)

  

根据Qt GroupBox QML Type documentation

     
    

GroupBox的隐式大小是根据其内容的大小计算的。

  

这意味着GroupBox将自动使用其子级的大小来计算自己的大小。 在您的情况下,唯一的子项是Column,其宽度等于GroupBox的宽度。我认为这就是造成绑定循环的原因。

如果按@eyllanesc设置列的宽度,绑定循环将消失。

我宁愿在QML部分中定义GroupBox的隐式宽度(默认情况下为宽度)。在我的示例中,隐式宽度为100px,但可以通过子级(ComboBox,其他GroupBox等)的宽度来计算。

// MyGroupBox.qml
import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.2

GroupBox {
    title: qsTr("1")
    implicitWidth: 100
    Column {
        id: column1
        width: parent.width
        ComboBox {
            id: cbComboBox
            currentIndex: 0
            editable: false
            width: parent.width
        }
        GroupBox {
            id: groupBox
            title: "test"
            width: parent.width
            Label {
                text: "1"
            }
        }
    }
}

通过更改根对象的宽度,可以直接从C ++根据您的项目设置实际宽度。

// main.cpp
#include <QtQuickWidgets/QQuickWidget>
#include <QQuickItem>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQuickWidget *view = new QQuickWidget;
    view->setSource(QUrl::fromLocalFile("://MyGroupBox.qml"));
    view->rootObject()->setWidth(800);
    view->show();
    return app.exec();
}