Qt Quick Controls 2 и TableView

Можно ли использовать TableView в приложении Quick Controls 2.0? Для этого потребуется иметь оба импорта:

import QtQuick.Controls 1.4
import QtQuick.Controls 2.0

Буду ли я получать какие-либо побочные эффекты?

Еще один связанный с этим вопрос: кажется, что TableView принадлежит к набору Quick Controls 1.0. Это? Означает ли это, что если можно использовать TableView, то можно использовать все элементы управления Quick Controls 1.0 в приложении Quick Controls 2.0?


person Alexander Dyagilev    schedule 15.04.2017    source источник
comment
TableView находится в разработке для элементов управления 2 и будет доступен где-то в (надеюсь, в ближайшем) будущем. В настоящее время вы можете использовать TableView из QC1, так как две библиотеки можно смешивать и сопоставлять, даже если они имеют несовместимый API. Вы можете использовать именованный импорт, чтобы избежать конфликта имен.   -  person BaCaRoZzo    schedule 15.04.2017


Ответы (2)


Хотя можно смешивать Qt Quick Controls 1 и 2 в одном приложении, самая большая проблема заключается в том, что Qt Quick Controls 1 несовместим с автоматическим масштабированием Qt с высоким разрешением, тогда как Qt Quick Controls 2 основывает свою масштабируемость на этом. Поэтому запуск такого приложения, которое смешивает эти два компонента, может не дать идеальных результатов на дисплее с высоким разрешением.

Учитывая, что Qt Quick Controls 1 TableView имеет серьезные проблемы с производительностью, одной из возможных альтернатив является использование простого ListView из ядра Qt Quick с Row в качестве делегата. В Qt 5.9 и более поздних версиях можно явно указать ширину содержимого и направления пролистывания, чтобы вертикальный ListView также можно было пролистывать горизонтально. Вот слишком простой пример списка из нескольких столбцов, который вы уже можете опробовать в последней бета-версии Qt 5.9:

import QtQuick 2.9
import QtQuick.Controls 2.2

ApplicationWindow {
    id: window
    width: 360
    height: 360
    visible: true

    ListView {
        id: listView
        anchors.fill: parent

        contentWidth: headerItem.width
        flickableDirection: Flickable.HorizontalAndVerticalFlick

        header: Row {
            spacing: 1
            function itemAt(index) { return repeater.itemAt(index) }
            Repeater {
                id: repeater
                model: ["Quisque", "Posuere", "Curabitur", "Vehicula", "Proin"]
                Label {
                    text: modelData
                    font.bold: true
                    font.pixelSize: 20
                    padding: 10
                    background: Rectangle { color: "silver" }
                }
            }
        }

        model: 100
        delegate: Column {
            id: delegate
            property int row: index
            Row {
                spacing: 1
                Repeater {
                    model: 5
                    ItemDelegate {
                        property int column: index
                        text: qsTr("%1x%2").arg(delegate.row).arg(column)
                        width: listView.headerItem.itemAt(column).width
                    }
                }
            }
            Rectangle {
                color: "silver"
                width: parent.width
                height: 1
            }
        }

        ScrollIndicator.horizontal: ScrollIndicator { }
        ScrollIndicator.vertical: ScrollIndicator { }
    }
}

Конечно, такой упрощенный многоколоночный список не предоставляет таких функций, как перемещаемые и изменяемые по размеру столбцы и другие навороты, которые были встроены в старый добрый тип TableView. С другой стороны, производительность находится на совершенно другом уровне, поэтому, если вы нацелены на что-то иное, чем классические среды рабочего стола, работающие на компьютерах с бесконечными ресурсами, возможно, стоит рассмотреть этот маршрут. ;)

person jpnurmi    schedule 08.05.2017
comment
Если у меня есть QAbstractTableModel в качестве модели. Есть ли способ использовать такой подход? Я не понимаю, как я могу сказать модели, какой столбец мне нужен. - person Denis Rouzaud; 02.11.2018
comment
Нет лучшего решения до Qt5.12, если мне нужен заголовок View (вертикальный и горизонтальный) и делегировать элемент другого столбца. - person Crawl.W; 22.01.2019
comment
как бы я сделал столбцы изменяемыми по размеру и перемещаемыми? любой источник? - person IceFire; 02.02.2019
comment
Данные не сортируются с этим решением - person quent; 18.03.2021
comment
Замените метку чем-то кликабельным и вызовите QAbstractItemModel::sort(). Это не Q_INVOKABLE, поэтому вам придется самостоятельно выставить его в QML. - person jpnurmi; 19.03.2021

import QtQuick.Controls 1.4 as C
import QtQuick.Controls 2.0

C.TableView {  //controls 1.4
   Button {  //controls 2.0
   }
}

Это поможет вам избежать нежелательных столкновений между двумя элементами управления.

person Brian    schedule 07.11.2017