子元素委托的QML窗口大小

时间:2018-06-14 13:54:51

标签: qt qml

我正在尝试为我正在计划的某个工具窗口创建一种通用的QML组件。

有没有办法根据所包含的delete m from messages m join (select m.*, (@rn := if(@u = userid, @rn + 1, if(@u := userid, 1, 1) ) ) as seqnum from (select m.* from messages m order by userid, id desc ) m cross join (select @u := -1, @rn := 0) params ) mm on m.id = mm.id where seqnum > 30; 的大小来实际设置所述窗口的大小? ListView的大小部分取决于其委托呈现的模型数据。这是一个代码示例,它将从外部的某个地方实例化:

ListView

所以基本上我试图访问例如import QtQuick 2.2 import QtQuick.Window 2.2 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 Window{ id:window title: "WindowTitle" modality: "ApplicationModal" flags: "Dialog" ListView { id: list model: model_inst delegate: RowLayout{ id: list_entry Text { text: "Model-based variable length text: " + text } ComboBox { model: listrole } Switch { text: qsTr("Switch") } } } } 作为窗口宽度的源list_entry.width不起作用,因为委托可能会在初始QML实例化后使用? 不确定是否有办法或者我不可避免地试图构建某种参考循环。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为它不会起作用。我尝试解决问题的第一步是使用contentWidth,但http://doc.qt.io/qt-5/qml-qtquick-listview.html#flickable-direction说:

  

默认情况下,垂直ListView将flickableDirection设置为Flickable.Vertical,水平ListView将其设置为Flickable.Horizo​​ntal。此外,垂直ListView仅计算(估计)contentHeight,而水平ListView仅计算contentWidth。另一个维度设置为-1。

因此,您必须自己设置contentWidth,因为您使用了垂直ListView。如果您尝试使用默认的contentWidth

     width: list.contentWidth

窗口没有宽度。因此,最好的解决方案可能是设置足够大的宽度:

import QtQuick 2.2
import QtQuick.Window 2.2
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3

Window {
    id: window
    title: "WindowTitle"
    modality: "ApplicationModal"
    flags: "Dialog"
    width: list.contentWidth
    height: list.contentHeight
    visible: true

    ListView {
        id: list
        model: 10
        contentWidth: 400
        anchors.fill: parent

        delegate: RowLayout {
            Text {
                text: "Model-based variable length text: " + index
            }
            ComboBox {
                model: 10
            }
            Switch {
               text: qsTr("Switch")
            }
        }
    }
}

你不一定要猜它。你可以用例如例如,TextMetrics计算您期望的最大文字宽度。虽然您仍然需要考虑RowLayout中的其他控件。

如果你可以使用ListView以外的其他类型,你可以考虑例如Repeater中的ColumnLayout,因为您可以使用其implicitWidthimplicitHeight属性:

import QtQuick 2.2
import QtQuick.Window 2.2
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3

Window {
    id: window
    title: "WindowTitle"
    modality: "ApplicationModal"
    flags: "Dialog"
    width: columnLayout.implicitWidth
    height: columnLayout.implicitHeight
    visible: true

    ColumnLayout {
        id: columnLayout
        anchors.fill: parent

        Repeater {
            id: repeater
            model: 10

            delegate: RowLayout {
                Text {
                    text: "Model-based variable length text: " + index
                }
                ComboBox {
                    model: 10
                }
                Switch {
                   text: qsTr("Switch")
                }
            }
        }
    }
}