qml formLayout实现方式

一、背景

我们制作界面时,通常有表单界面需要制作,如下图:

但是Qt5 是没有 formLayout 的,直到Qt6才有,所以现在 qml 使用 TableView 来实现这个样式

二、实现

cpp 复制代码
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
            }
        }
    }

数据格式是

cpp 复制代码
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);
相关推荐
谁刺我心2 天前
[QtCPP]Examples使用示例-QtMultimedia、QMediaPlayer、Audio音频引擎测试mp3播放
qt·音视频·qml
Quz2 天前
Qt Quick 粒子系统(二):系统控制与生命周期管理
qt·qml·粒子系统
Quz2 天前
Qt Quick 粒子系统(三):发射器深度解析
qt·qml·粒子系统
nnnnichijou4 天前
Qt 6.9 嵌入式 Linux 交叉编译全栈填坑指南(以树莓派5 AArch64 为例
qt·嵌入式·交叉编译·qml·树莓派5
Quz5 天前
Qt Quick 粒子系统(一):架构总览与四层模型
qt·架构·qml
Ulyanov11 天前
深入QML-Python通信 构建响应式交互界面的桥梁设计:QML+PySide6现代开发入门(五)
开发语言·python·算法·交互·qml·系统仿真
学习,学习,在学习12 天前
Modbus TCP同步通信方式实现异步级效率
网络·c++·qt·网络协议·tcp/ip·qt5
学习,学习,在学习13 天前
Modbus TCP 协议深度解析与 Qt 实战指南
网络·c++·qt·tcp/ip·modbus·qt5
Shadow(⊙o⊙)16 天前
Qt-Lambda捕获使用+阶段性综合使用
开发语言·c++·qt·qt5
学习,学习,在学习19 天前
Qt 串口通讯架构
开发语言·c++·qt·架构·qt5