qml formLayout实现方式

一、背景

我们制作界面时,通常有表单界面需要制作,如下图:
在这里插入图片描述
但是Qt5 是没有 formLayout 的,直到Qt6才有,所以现在 qml 使用 TableView 来实现这个样式

二、实现

enum ComponentType {
        TitleText,
        Text,
        Button,
        Image
    }
TableView {
        id: _ifoView
        clip: true
        property int fColumnWidth: 75
        property int sColumnWidth: 280

        model: TableModel {
            id: _ifoViewModel
            TableModelColumn { display: "FColumn" }
            TableModelColumn { display: "SColumn" }
            rows: []
        }

        delegate: Item {
            implicitWidth: display.dataType === DeviceInfo.TitleText? _ifoView.fColumnWidth : _ifoView.sColumnWidth
            implicitHeight: display.height
            Loader{
                id: _loader
                anchors.fill: parent
                onLoaded: {
                    _loader.item.dataDisplay = display;
                }
            }

            Component.onCompleted: {
                switch (display.dataType){
                case DeviceInfo.TitleText:
                    _loader.sourceComponent = _TitleTextComponent
                    break;
                case DeviceInfo.Text:
                    _loader.sourceComponent = _TextComponent
                    break;
                case DeviceInfo.Button:
                    _loader.sourceComponent = _ButtonComponent
                    break;
                case DeviceInfo.Image:
                    _loader.sourceComponent = _ImageComponent
                    break;
                }
            }
        }
    }
    Component{
        id: _TitleTextComponent
        Rectangle{
            anchors.fill: parent
            property var dataDisplay
            color:"transparent"
            Text {
                text: dataDisplay.title
                anchors.left: parent.left
                opacity: 0.7
                font.pixelSize: 13
            }
        }
    }
    Component{
        id: _TextComponent
        Rectangle{
            anchors.fill: parent
            color:"transparent"
            property var dataDisplay
            Text {
                text: dataDisplay.title
                anchors.left: parent.left
                font.pixelSize: 13
                width: _ifoView.sColumnWidth
                wrapMode: Text.WordWrap
            }
        }
    }
    Component{
        id: _ButtonComponent
        Rectangle{
            anchors.fill: parent
            color:"transparent"
            property var dataDisplay
            Text {
                id: _text
                text: dataDisplay.title
                anchors.left: parent.left
                anchors.top: parent.top
                font.pixelSize: 13
            }
            Button {
                text: qsTr("复制")
                anchors.left: _text.right
                anchors.leftMargin: 10
                anchors.verticalCenter: _text.verticalCenter
                alwaysHighlight: true
                font.pixelSize: 13
                onClicked: {
                }
            }
        }
    }
    Component{
        id: _ImageComponent
        Rectangle{
            anchors.fill: parent
            property var dataDisplay
            color:"transparent"
            Image {
                id: _image
                width: 24
                height: 16
                source: dataDisplay.source
                anchors.left: parent.left
                anchors.top: parent.top
            }
            Text {
                text: dataDisplay.title
                anchors.left: _image.right
                anchors.leftMargin: 5
                anchors.verticalCenter: _image.verticalCenter
                font.pixelSize: 13
            }
        }
    }

数据格式是

function aovIfo()
    {
        var codeRow = {"FColumn": {dataType:DeviceInfo.TitleText, title:"设备", height:20},
            "SColumn": {dataType:DeviceInfo.Button, title:"设备", height:22}}
        _ifoViewModel.appendRow(codeRow);
        var powerLevelRow = {"FColumn": {dataType:DeviceInfo.TitleText, title:"版本", height:20},
            "SColumn": {dataType:DeviceInfo.Image, title:"1%", height:22, source:""}}
        _ifoViewModel.appendRow(powerLevelRow);
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值