网站前台的网址,已申请域名怎么做网站,如何搭建服务器做网站,上海p2p网站建设一、可能遇到的一些问题
Q1#xff1a;如何禁用拖动#xff1f;
在TableView下加一句代码即可#xff1a;
interactive: false
补充#xff1a;这个属性并不专属于TableView#xff0c;而是一个通用属性。很多Controls下的控件都可以使用#xff0c;其主要作用就是控…
一、可能遇到的一些问题
Q1如何禁用拖动
在TableView下加一句代码即可
interactive: false
补充这个属性并不专属于TableView而是一个通用属性。很多Controls下的控件都可以使用其主要作用就是控制交互的。
举个例子像width、height、color这些都属于通用属性并不是说只有一个控件需要指定它的宽高、颜色。这种通用特性在QML是非常常见的。
或许你想给某个控件实现某种功能没准这个功能其实就是其他控件中的一个属性罢了。 Q2设置了标题栏之后程序直接卡死
可能是Layout布局的问题把Layout布局换成Item试试。
Q3表头数据和内容数据重叠显示了或者一片空白
大概率还是布局的问题检查一下吧
补充在 HorizontalHeaderView 中使用了 syncView 属性就相当于是将 HorizontalHeaderView 和指定的 TableView 绑定了它默认会有个布局就是把水平标题栏放在表格内容的上方但是左右的对齐方式可能并不是我们想要的所以在做整体布局时需要注意这一点。
还有其它问题
上面的几个问题是我在做这个实例的时候遇到的如果你有别的问题可以在评论区留言我会逐一回复哦~
二、QML TableView 实例演示
下面截图中的红框部分就是最终的效果虽然看似简陋实际确实有点简陋。。。。
好消息是这个只是我用来演示给大家看的并不是我个人审美就这样。。。。所以等大家学会了怎么去用 TableView 这个控件就按照自己的想法和需求去设计它吧 实现步骤1TableModel
在QML中像TableView、ListView这种控件视图View和数据model都是分开的。所以我们需要依次去完善他们。
那么先来实现一个model吧 //表头数据放TableModelColumn里内容数据放rows里由TableModel统一管理TableModel{id: tablemodel_2TableModelColumn { display: 状态 } //后面表头会用到TableModelColumn { display: 简称 }TableModelColumn { display: 售价 }TableModelColumn { display: 库存 }rows: //表格里具体显示的内容[{状态: true,简称: AK-74自动步枪,售价: 149,库存: 500},{状态: true,简称: 81式自动步枪,售价: 199,库存: 300},{状态: true,简称: M16突击步枪,售价: 119,库存: 100},{状态: true,简称: SCAR突击步枪,售价: 129,库存: 100},{状态: true,简称: HKG36突击步枪,售价: 159,库存: 100}]}
在上面的代码片段中最外层是1个TableModel这个TableModel和TableView是同级的不是写在TableView下面的哈文章最后我会把完整的代码也发出来。
我们这个TableModel定义1个id叫tablemodel_2因为等会后面需要通过id来调用这个TableModel里面的数据。
接着我们连续写了4行TableModelColumn这个是后面要用到的水平标题栏的数据每一个TableModelColumn就代表1列。
最后是1个 rows这个rows后面紧跟的一个是列表[ ]列表里面放的就是除表头以外的数据了。形式就是花括号里一对对的键和值而键就是上面TableModelColumn中的文本也就是列名值才是每个单元格中具体要显示出来的数据。
然后你可能会想到哎呀~这么多行代码下去实际就显示5行数据如果列很多、数据成千上万这代码得写多长啊
这点不用担心啦因为QML的专家早就考虑到了。如果数据量很少而且是固定的model直接写出来就行了。如果数据多那最好用C的模型类来提供。需要注意的是C模型必须是QAbstractItemModel的子类。
这个C的模型类有点复杂后面我会专门写一篇文章来介绍它。
实现步骤2TableView
做完数据层model下面我们就来做具体的外观View吧请看下面代码 View层大概分为2个部分蓝色框框里是一些整体的属性设置绿色框框里是针对每一列数据的显示细节的描述。
在delegate中我们写了4个DelegateChoice。一共是5行数据为什么我们只写了4个因为如果你只是简单的显示model里的数据、不会有交互那么就统一用一个DelegateChoice就行啦
什么叫不会有交互你看前面截图中第一列的数据是不是都是复选框复选框是干嘛的不就是给用户去勾选、去交互的嘛~
所以像这种后期会交互的数据列就要单独的DelegateChoice去写。我展开第一个DelegateChoice中的代码给你看一下
DelegateChoice {column: 0 //指定哪一列可编辑delegate: Rectangle{implicitWidth: 150implicitHeight: 40color: t_tableView_2.currentRow row ? #c8e5b3 : #eeeeeeCheckBox{anchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftchecked: model.display //CheckBox的默认状态就是模型里的值onToggled: model.display checked //编辑即更新数据到模型Material.accent: green}}}
看到了吗里面竟然还有一个delegate这个最里层的delegate就是设置具体的单元格的显示方式啦
可能有了解ListView的小伙伴好奇了我之前做ListView的时候只需要1个delegate就行了怎么这个TableView还要套2层delegate外面竟然还有个什么DelegateChoice这个DelegateChoice又是什么干啥用的
这个DelegateChoice是按列去设置的每一列都有不同的情况和需求如果我们这个表格是涉及到交互、而不单单是给用户看看的那就需要用DelegateChoice对具体的列去设置因为可能第1列全部是复选框第3列又全都是单行输入框怎么都得去单独设置~
实现步骤3HorizontalHeaderView
这个HorizontalHeaderView就是水平标题栏啦
HorizontalHeaderView {id: horizontalHeaderViewsyncView: t_tableView_2interactive: false //禁用拖动delegate: Rectangle {implicitWidth: 150; implicitHeight: 40; color: transparentText {text: tablemodel_2.columns[index].displayfont.bold: trueanchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 10}}}
这个水平标题栏和TableView也是同级的不要写到TableView里面去喽
在QML中标题栏和表格是分开设置的所以设置了标题栏之后需要通过syncView属性去绑定具体的TableView。
然后这个水平标题栏也是默认有交互效果的如果你不想让它动就也用interactive属性禁用吧
完整代码
import QtQuick
import QtQuick.Controls.Material
import QtQuick.Controls
import QtQuick.Layouts
import Qt.labs.qmlmodels //TableModel需要用到的库Item {//表头数据放TableModelColumn里内容数据放rows里由TableModel统一管理TableModel{id: tablemodel_2TableModelColumn { display: 状态 } //后面表头会用到TableModelColumn { display: 简称 }TableModelColumn { display: 售价 }TableModelColumn { display: 库存 }rows: //表格里具体显示的内容[{状态: true,简称: AK-74自动步枪,售价: 149,库存: 500},{状态: true,简称: 81式自动步枪,售价: 199,库存: 300},{状态: true,简称: M16突击步枪,售价: 119,库存: 100},{状态: true,简称: SCAR突击步枪,售价: 129,库存: 100},{状态: true,简称: HKG36突击步枪,售价: 159,库存: 100}]}TableView{id: t_tableView_2width: contentWidthheight: contentHeightanchors.top: horizontalHeaderView.bottominteractive: false //禁止拖动rowSpacing: 1 //行间距。列间距是columnSpacingmodel: tablemodel_2//行选择选中事件的处理selectionModel: ItemSelectionModel {}//指定可编辑的列把CheckBox控件放进表格中delegate: DelegateChooser {DelegateChoice {column: 0 //指定哪一列可编辑delegate: Rectangle{implicitWidth: 150implicitHeight: 40color: t_tableView_2.currentRow row ? #c8e5b3 : #eeeeeeCheckBox{anchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftchecked: model.display //CheckBox的默认状态就是模型里的值onToggled: model.display checked //编辑即更新数据到模型Material.accent: green}}}DelegateChoice {column: 2delegate: Rectangle{implicitWidth: 150implicitHeight: 40color: t_tableView_2.currentRow row ? #c8e5b3 : #eeeeeeBasicTextField{anchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 10width: 80; height: 30text: model.displayonAccepted: model.display text //回车更新数据onEditingFinished: model.display text //焦点改变更新数据}}}DelegateChoice {column: 3delegate: Rectangle{implicitWidth: 150; implicitHeight: 40color: t_tableView_2.currentRow row ? #c8e5b3 : #eeeeeeBasicTextField{anchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 10width: 80; height: 30text: model.displayonAccepted: model.display text //回车更新数据onEditingFinished: model.display text //焦点改变更新数据}}}DelegateChoice //默认显示方式不指定具体列{delegate: Rectangle{implicitWidth: 150; implicitHeight: 40//选中行变色(生效前提是为selectionModel分配一个ItemSelectionModel)color: t_tableView_2.currentRow row ? #c8e5b3 : #eeeeeeText{text: displayanchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 10}}}}}HorizontalHeaderView {id: horizontalHeaderViewsyncView: t_tableView_2interactive: false //禁用拖动delegate: Rectangle {implicitWidth: 150; implicitHeight: 40; color: transparentText {text: tablemodel_2.columns[index].displayfont.bold: trueanchors.verticalCenter: parent.verticalCenteranchors.left: parent.leftanchors.leftMargin: 10}}}
}