【问题标题】:QML TumblerColumn width exceeds ColumnLayout geometryQML TumblerColumn 宽度超过 ColumnLayout 几何
【发布时间】:2016-01-08 20:04:52
【问题描述】:

我有以下 QML Tumbler:

import QtQuick 2.0
import QtMultimedia 5.5
import QtQuick.Controls 1.3
import QtQuick.Extras 1.4
import QtQuick.Layouts 1.2
import QtQuick.Window 2.2
import QtTest 1.1

import "../items"

Rectangle
{
    id: ueNumericTumbler

    color: "grey"

    ColumnLayout
    {
        id: ueMainLayout

        anchors.rightMargin: parent.radius
        anchors.leftMargin: parent.radius
        anchors.bottomMargin: parent.radius
        anchors.topMargin: parent.radius
        anchors.centerIn: parent

        antialiasing: true
        spacing: 4
        anchors.fill: parent
        layoutDirection: Qt.LeftToRight

        Tumbler
        {
            id: ueLoginKeypadTumbler

            antialiasing: true

            Layout.alignment: Qt.AlignHCenter
            Layout.fillWidth: true
            Layout.fillHeight: false

            Layout.minimumWidth: parent.width
            Layout.minimumHeight: parent.height*70/100

            Layout.preferredWidth: parent.width
            Layout.preferredHeight: parent.height*70/100

            Layout.maximumWidth: parent.width
            Layout.maximumHeight: parent.height*70/100

            activeFocusOnTab: false

            UeNumericTumblerColumn
            {
                id: ueTumblerColumnDigit1000

                ueWidth: ueNumericTumbler.Layout.preferredWidth/ueLoginKeypadTumbler.columnCount
            }   // UeNumericTumblerColumn

            UeNumericTumblerColumn
            {
                id: ueTumblerColumnDigit100

                ueWidth: ueNumericTumbler.Layout.preferredWidth/ueLoginKeypadTumbler.columnCount
            }   // UeNumericTumblerColumn

            UeNumericTumblerColumn
            {
                id: ueTumblerColumnDigit10

                ueWidth: ueNumericTumbler.Layout.preferredWidth/ueLoginKeypadTumbler.columnCount
            }   // UeNumericTumblerColumn

            UeNumericTumblerColumn
            {
                id: ueTumblerColumnDigit1

                ueWidth: ueNumericTumbler.Layout.preferredWidth/ueLoginKeypadTumbler.columnCount
            }   // UeNumericTumblerColumn
        }   // Tumbler
    }   // ColumnLayout

}   // Rectangle

现在,正如您在屏幕截图中看到的那样,Tumbler Columns 的宽度大于父级的 ColumnLayout 几何形状,这是错误的。我错过了什么?我已经考虑了ueNumericTumblerColumnLayout 但问题仍然存在,我不知道该怎么办!我应该使用锚点吗? 还是ueNumericTumbler的父容器矩形/窗口中的问题,命名为ueKeypad

import QtQuick 2.0
import QtMultimedia 5.5
import QtQuick.Controls 1.3
import QtQuick.Extras 1.4
import QtQuick.Layouts 1.2
import QtQuick.Window 2.2
import QtTest 1.1

import "../delegates"
import "../items"

Rectangle
{
    id: ueKeypad

    width: 512
    height: 384
    color: "grey"
    radius: 8
    border.color: "steelblue"
    border.width: 4

    ColumnLayout
    {
        id: ueMainLayout

        anchors.rightMargin: parent.radius
        anchors.leftMargin: parent.radius
        anchors.bottomMargin: parent.radius
        anchors.topMargin: parent.radius
        anchors.centerIn: parent

        antialiasing: true
        spacing: 4
        anchors.fill: parent
        layoutDirection: Qt.LeftToRight

        UeNumericTumbler
        {
            id: ueLoginKeypadTumbler

            Layout.alignment: Qt.AlignHCenter
            Layout.fillWidth: true
            Layout.fillHeight: false

            Layout.minimumWidth: parent.width
            Layout.minimumHeight: parent.height*70/100

            Layout.preferredWidth: parent.width
            Layout.preferredHeight: parent.height*70/100

            Layout.maximumWidth: parent.width
            Layout.maximumHeight: parent.height*70/100
        }   // UeNumericTumbler
    }   // ColumnLayout

    states:
    [
        State
        {
            name: "ueStateLoginOk"

            PropertyChanges
            {
                target: ueKeypad
                border.color: "#00ff00"
            }
        },

        State
        {
            name: "ueStateLoginOkFailed"
            PropertyChanges
            {
                target: ueKeypad
                border.color: "#ff0000"
            }
        }
    ]
}

【问题讨论】:

  • 您的最后一次编辑本身就是一个单独的问题,IMO。也许其他人会回答它,但原来的问题有一个解决方案。

标签: qt qml qtquick2 qtquickcontrols qtquickextras


【解决方案1】:

您在错误的对象上使用了Layout 附加属性; Layout.preferredWidth 仅设置在 Tumbler 上,而不是 TumblerColumn。您可以通过在表达式的 return 语句之前添加 print() 行来调试它:

TumblerColumn
{
    model: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    width: {
        print(Layout.preferredWidth)
        Layout.preferredWidth/4
    }
}

这将打印-1,即default value。您可以将 width 设置为此:

ueLoginKeypadTumbler.Layout.preferredWidth / 4

不过,您需要考虑分隔符的宽度……呃。这不是很好。请打开bug report 提到这个用例应该更容易。

【讨论】:

  • 我已经重写了答案,请看一下!
  • 正如我在回答中所说,您需要考虑分隔符的宽度。也可能是框架。这就是我建议创建错误报告的原因,因为它不好。
  • 好的,但是如果我将宽度硬编码到每一列中,它会起作用,但这是个坏主意,不是吗?
  • 如果您有多个分辨率不同的目标设备,这只是一个坏主意。但是,是的,计算宽度比硬编码好。
猜你喜欢
  • 2015-08-19
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 2018-12-02
  • 2012-12-13
  • 2012-07-16
相关资源
最近更新 更多