Qt Quick Controls 2 and TableView

15

在Quick Controls 2.0应用程序中使用TableView是否可以?这将需要引入两个导入:

import QtQuick.Controls 1.4
import QtQuick.Controls 2.0

我会有任何副作用吗?

另一个相关的问题:似乎TableView属于Quick Controls 1.0集。 是吗? 这是否意味着如果可以使用TableView,则可以在Quick Controls 2.0应用程序中使用所有Quick Controls 1.0控件?


1
“TableView”正处于控件2的开发中,并将在(希望不久的)未来的某个时间可用。目前,您可以从QC1中使用“TableView”,因为这两个库可以混合使用,即使它们具有不兼容的API。 您可以使用命名导入以避免名称冲突。 - BaCaRoZzo
2个回答

21

虽然在同一个应用程序中混合使用Qt Quick Controls 1和2是可能的,但最大的问题是Qt Quick Controls 1不兼容Qt的自动高DPI缩放,而Qt Quick Controls 2基于此进行可扩展性。因此,在高DPI显示器上运行这样混合使用两者的应用程序可能会得不到理想的结果。

鉴于Qt Quick Controls 1的TableView存在严重性能问题,一种可能的替代方案是使用来自Qt Quick core的普通ListView,并将其作为委托使用Row。使用Qt 5.9及更高版本,可以显式地指定内容宽度和滑动方向,以便垂直ListView也可以水平滚动。以下是一个过度简化的多列列表示例,您可以使用最新的Qt 5.9 beta版本尝试:

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 类型中的花哨功能。另一方面,性能却有着完全不同的水平,因此如果你的目标不是在计算机资源无限的经典桌面环境上运行,那么考虑采用这种方法可能是值得的。;)


如果我有一个QAbstractTableModel作为模型,是否有一种方法可以使用这种方法?我不知道如何告诉模型我需要哪一列。 - Denis Rouzaud
在Qt5.12之前,如果我需要不同列的headerView(垂直和水平)和delegate item,没有比它更好的解决方案。 - Crawl.W
我该如何使列可调整大小和移动呢?有什么参考资料吗? - IceFire
此解决方案无法对数据进行排序。 - quent
将标签替换为可点击的内容,并调用QAbstractItemModel :: sort()函数。它不是Q_INVOKABLE,所以您必须自己将其暴露给QML。 - jpnurmi

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

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

这将帮助您避免两个控件之间的任何意外冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接