Как изменить размер столбца QML TableView до его содержимого при запуске приложения? - PullRequest
0 голосов
/ 14 сентября 2018

Я использую Qt 5.9.4 в Ubuntu 18.04.

Когда мое приложение запускается, я хочу автоматически настроить размер столбца TableView в соответствии с его содержимым.У модели есть некоторые данные при запуске.

Я знаю о функции resizeColumnToContents, но я не знаю, как ее вызвать.

onDataChange не работает в TableView:Механизм QML говорит, что этот сигнал не существует.Но intellitype позволяет мне напечатать его в коде.

Как это сделать?

1 Ответ

0 голосов
/ 14 сентября 2018

РЕДАКТИРОВАТЬ 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
    }
}
...