Qt 动态列宽度
我有4列的Qt 动态列宽度,qt,qml,Qt,Qml,我有4列的TableView。当我放大主窗口的宽度时,我也需要放大第一列的宽度 旧方法(非QML)是: 现在我做了一些类似下面的例子,但这并不完全完美 当我调整某些列的大小时,此构造将停止工作。当主窗口更改其大小时,所有列都保持实际状态并停止调整大小 当我将来添加新列(忘记重写这个代码)或动态添加一些列时,这也会停止工作 QML文件:: TableView { id: ccPanel model: ccModel TableViewColumn {
TableView
。当我放大主窗口的宽度时,我也需要放大第一列的宽度
旧方法(非QML)是:
现在我做了一些类似下面的例子,但这并不完全完美
TableView {
id: ccPanel
model: ccModel
TableViewColumn {
id: ccName
role: "name"
title: "Name"
width: ccPanel.width - ccSize.width - ccDate.width
}
TableViewColumn {
id: ccSize
role: "size"
title: "Size"
width: 60
}
TableViewColumn {
id: ccDate
role: "Date"
title: "Datum"
width: 85
}
}
你知道如何帮助我吗?嗯,我可以想出一个解决方案,但它并不漂亮: 基本上,您必须执行手动列管理,跟踪数组中的所有当前列,并且每次添加、删除或调整列的大小时,都必须执行一个函数来动态生成列宽的绑定:
column.height = Qt.binding(function() { return property_evaluating_expressions })
如果我想说的话,我们到了。在这个时候,它不是完美的,但它是解决方案。我对调整主窗口大小的事件作出响应。不完美,因为不包含实际的名称大小。在扩大名称的过程中,有时会不合理地将名称转换为新值
TableView
{
id: ccPanel
property var oldWidth: ccPanel.width
model: ccModel
onWidthChanged:
{
var newWidth = ccName.width + (ccPanel.oldWidth - ccName.width - ccDate.width - ccSize.width);
if(newWidth > 19)
{
ccName.width = newWidth
}
ccPanel.oldWidth = ccPanel.width;
}
TableViewColumn
{
...
...
...
要消除奇怪的大小调整,请手动使最后一列不可调整大小,并使用列的
widthChanged
信号以及选项卡视图中的信号。下面的代码生成一个非常接近Qt TableView头的行为
TableView
{
id: ccPanel
model: ccModel
anchors.fill: parent
onWidthChanged:ccName.width = Math.max(100, ccPanel.width - ccSize.width - ccDate.width)
TableViewColumn
{
id: ccName
role: "name"
title: "Name"
onWidthChanged: ccDate.width = Math.max(60, ccPanel.width - ccSize.width - ccName.width)
}
TableViewColumn
{
id: ccSize
role: "size"
title: "Size"
width: 60
onWidthChanged: ccDate.width = Math.max(85, ccPanel.width - ccSize.width - ccName.width)
}
TableViewColumn
{
resizable: false
id: ccDate
role: "Date"
title: "Datum"
width: 85
}
}
如果将
resizeable
设置为false
,则应修复这些错误。但是我不知道用户是否应该能够调整列的大小。不,这个设置禁止用鼠标改变列的大小。这正是我的意思。
TableView
{
id: ccPanel
model: ccModel
anchors.fill: parent
onWidthChanged:ccName.width = Math.max(100, ccPanel.width - ccSize.width - ccDate.width)
TableViewColumn
{
id: ccName
role: "name"
title: "Name"
onWidthChanged: ccDate.width = Math.max(60, ccPanel.width - ccSize.width - ccName.width)
}
TableViewColumn
{
id: ccSize
role: "size"
title: "Size"
width: 60
onWidthChanged: ccDate.width = Math.max(85, ccPanel.width - ccSize.width - ccName.width)
}
TableViewColumn
{
resizable: false
id: ccDate
role: "Date"
title: "Datum"
width: 85
}
}