QML滑块调整矩形

Posted

技术标签:

【中文标题】QML滑块调整矩形【英文标题】:QML Slider adjusting rectangle 【发布时间】:2019-05-29 12:35:57 【问题描述】:

我在这里有几个问题,因为我是 qml 的新手。我有一个简单的界面,我希望滑块调整矩形的大小(最终将是一个 svg 图标)。图片下方的问题:

    调整滑块时,它会正确更改蓝色矩形的大小,但是我怎样才能使其正确地自动调整绿色边界矩形的大小以包含它?它应该类似于下图。目前缩略图超出了绿色矩形的范围。如果有帮助,组合框的静态宽度可以为 150。

    如何使蓝色矩形始终垂直居中对齐?它似乎总是固定在左上角。

QML

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ColumnLayout 
    anchors.fill: parent

    Flow 
        Layout.fillWidth: true
        spacing: 10

        Repeater 
            model: 5

            Rectangle 
                id: delegateBackground
                width: 200;
                height: contentContainer.height + 10
                border.width: 1
                color: "lightgreen"

                Item 
                    id: contentContainer
                    width: parent.width - 10
                    height: rowContainer.height
                    anchors.centerIn: delegateBackground

                    RowLayout 
                        id: rowContainer
                        width: parent.width

                        Rectangle 
                            id: icon
                            width: thumbnailsize.value
                            height: thumbnailsize.value
                            color: "steelblue"
                            Layout.alignment: Qt.AlignCenter
                        

                        ComboBox 
                            id: selector
                            Layout.fillWidth: true
                            model: [ "Banana", "Apple", "Coconut" ]
                            Layout.alignment: Qt.AlignCenter
                        
                    
                
            
        
    

    Slider 
        id: thumbnailsize
        from: 16
        value: 48
        to: 64
    

【问题讨论】:

【参考方案1】: 首先你不能在布局中使用属性“width”和“height”,所以你需要使用“Layout.preferredWidth”和“Layout.preferredHeight”。 因此您需要在代码中进行以下更改:-
// ...
// ...

    Rectangle 
                id: icon

                Layout.preferredWidth: thumbnailsize.value
                Layout.preferredHeight: thumbnailsize.value
                // #### You can use width and height inside Layouts
    //          width: thumbnailsize.value
    //          height: thumbnailsize.value
                color: "steelblue"
                Layout.alignment: Qt.AlignCenter
              

// ...
// ..
我猜你甚至会在将滑块移动到最大值时遇到问题,蓝色矩形移出其父级,即浅绿色矩形。(下图)

滑块最大值错误

因此,如果您按照上述说明进行更改,此问题也将得到解决。

进行更改后,以下是示例输出:-

最小值:-

最小值

最大值:-

最大值

【讨论】:

【参考方案2】:

这是你想要的吗:

QML 代码:

ColumnLayout 
    anchors.fill: parent

    Flow 
        Layout.fillWidth: true
        spacing: 10

        Repeater 
            model: 5

            Rectangle 
                id: delegateBackground
                width: 200;
                height: contentContainer.height + 10
                border.width: 1
                color: "lightgreen"

                Item 
                    id: contentContainer
                    width: parent.width - 10
                    height: rowContainer.height
                    anchors.centerIn: delegateBackground

                    RowLayout 
                        id: rowContainer
                        anchors.centerIn: contentContainer
                        height: Math.max(iconContainer.height, selector.height)

                        Item
                            id: iconContainer
                            width: contentContainer.width - selector.width
                            height: parent.height

                            Rectangle 
                                id: icon
                                width: thumbnailsize.value + selector.width > contentContainer.width ? contentContainer.width - selector.width : thumbnailsize.value
                                height: width
                                color: "steelblue"
                                anchors.centerIn: parent
                            
                        

                        ComboBox 
                            id: selector
                            Layout.fillWidth: true
                            model: [ "Banana", "Apple", "Coconut" ]
                            Layout.alignment: Qt.AlignCenter
                        
                    
                
            
        
    

    Slider 
        id: thumbnailsize
        from: 16
        value: 48
        to: 64
    

【讨论】:

以上是关于QML滑块调整矩形的主要内容,如果未能解决你的问题,请参考以下文章

QML:调整复选框大小

调整 QML 图像显示大小

除非我调整窗口大小,否则 QML 文本不会更新

调整窗口大小时,光滑的滑块没有响应

使用自定义 QT 代码显示 QML 文件(实现调整大小/移动功能)

覆盖 QML 行的 MouseArea(或自动调整大小的图像+文本)