РЕДАКТИРОВАТЬ 18/09/18
Если вы используете StackView или вы можете предварительно загрузить TableView
// main.qml
Loader {
id: tableViewLoader
active: true
sourceComponent: TableView { id: tableView }
}
StackView {
id: stackView
initialItem: listViewLoader
function onContentReceived()
{
stackView.push(tableViewLoader);
tableViewLoader.item.resizeColumnsToContents()
}
function onContentClosed()
{
swipeView.pop()
}
}
РЕДАКТИРОВАТЬ 17/09/18
Вы правы, Данил.
В TableView.qml указано, что
Depending on how the model is populated, the model may not be ready when
TableView Component.onCompleted is called. In that case you may need to
delay the call to positionViewAtRow by using a \l {QtQml::Timer}{Timer}
Для меня это работает
Component.onCompleted: resizeColumnsToContentsTimer.start()
Timer {
id: resizeColumnsToContentsTimer
interval: 50
running: false
repeat: false
onTriggered: parent.resizeColumnsToContents()
}
Вытакже можно увидеть это обсуждение по этому поводу
http://lists.qt -project.org / pipermail / интереса / 2016-июнь / 023018.html
Может быть, выможет вызвать его в onModelChanged, который вызывается при настройке вашей модели (ваша модель должна быть заполнена раньше).
onModelChanged: tableView.resizeColumnToContents()
В противном случае вы можете использовать сигналы / слоты, когда ваши данные готовы.
НоОстерегайтесь этой функции: если у вас есть делегат, вы должны указать implicitWidth в, иначе это не сработает.
headerDelegate: Rectangle {
id: headerDelegate
height: 36
implicitWidth: textItem.implicitWidth + textItem.padding * 2
color: Style.lightColor
Text {
id: textItem
anchors.fill: parent
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
padding: 10
text: styleData.value
elide: Text.ElideRight
color: Style.darkColor
font.pixelSize: Style.bigFontPixelSize
}
}