diff options
author | Yulong Bai <yulong.bai@qt.io> | 2019-04-11 17:30:49 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2020-02-11 06:44:57 +0000 |
commit | 0b607bfe14048e32dd81855e1497dda3465b5183 (patch) | |
tree | f0a418154b06579ee1b5ccf95ce48e15aaad56d0 /tests/manual | |
parent | 729bf567eda304b52a7d0b120b1006b01bc84240 (diff) |
Add HorizontalHeaderView and VerticalHeaderViewv5.15.0-alpha1
[ChangeLog][Controls] Add HorizontalHeaderView and VerticalHeaderView.
They are controls associated with TableView. Support flicking synchronization
Support default, fusion, imagine, material and universal delegate styles.
Fixes: QTPM-1300
Change-Id: Ie3f913dd616cda0d4e5a22a3d95baf71692370fe
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/manual')
-rw-r--r-- | tests/manual/headerview/headerview.pro | 10 | ||||
-rw-r--r-- | tests/manual/headerview/main.cpp | 218 | ||||
-rw-r--r-- | tests/manual/headerview/main.qml | 130 | ||||
-rw-r--r-- | tests/manual/manual.pro | 1 |
4 files changed, 359 insertions, 0 deletions
diff --git a/tests/manual/headerview/headerview.pro b/tests/manual/headerview/headerview.pro new file mode 100644 index 00000000..474cc921 --- /dev/null +++ b/tests/manual/headerview/headerview.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = headerview +QT += qml quick quick-private quickcontrols2 quickcontrols2-private \ + quicktemplates2-private quicktemplates2 +SOURCES += main.cpp +RESOURCES += main.qml +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/tests/manual/headerview/main.cpp b/tests/manual/headerview/main.cpp new file mode 100644 index 00000000..4c1e611c --- /dev/null +++ b/tests/manual/headerview/main.cpp @@ -0,0 +1,218 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QAbstractTableModel> +#include <QDebug> +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +class TestTableModel : public QAbstractTableModel { + Q_OBJECT + Q_PROPERTY(int rowCount READ rowCount WRITE setRowCount NOTIFY rowCountChanged) + Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount NOTIFY columnCountChanged) + +public: + TestTableModel(QObject *parent = nullptr) + : QAbstractTableModel(parent) + { + } + + int rowCount(const QModelIndex & = QModelIndex()) const override + { + return m_rows; + } + virtual void setRowCount(int count) + { + beginResetModel(); + m_rows = count; + emit rowCountChanged(); + endResetModel(); + } + + int columnCount(const QModelIndex & = QModelIndex()) const override + { + return m_cols; + } + virtual void setColumnCount(int count) + { + beginResetModel(); + m_cols = count; + emit columnCountChanged(); + endResetModel(); + } + + int indexValue(const QModelIndex &index) const + { + return index.row() + (index.column() * rowCount()); + } + + Q_INVOKABLE QModelIndex toQModelIndex(int serialIndex) + { + return createIndex(serialIndex % rowCount(), serialIndex / rowCount()); + } + + Q_INVOKABLE QVariant data(int row, int col) + { + return data(createIndex(row, col), Qt::DisplayRole); + } + QVariant data(const QModelIndex &index, int role) const override + { + if (!index.isValid()) + return QVariant(); + + switch (role) { + case Qt::DisplayRole: + return QLatin1String("Foo"); + case Qt::EditRole: + return m_checkedCells.contains(indexValue(index)); + default: + return QVariant(); + } + } + + bool setData(const QModelIndex &index, const QVariant &value, + int role = Qt::EditRole) override + { + + if (role != Qt::EditRole) + return false; + + int i = indexValue(index); + bool checked = value.toBool(); + if (checked == m_checkedCells.contains(i)) + return false; + + if (checked) + m_checkedCells.insert(i); + else + m_checkedCells.remove(i); + + emit dataChanged(index, index, { role }); + return true; + } + + Q_INVOKABLE QHash<int, QByteArray> roleNames() const override + { + return { + { Qt::DisplayRole, "display" }, + { Qt::EditRole, "edit" } + }; + } + +signals: + void rowCountChanged(); + void columnCountChanged(); + +private: + int m_rows = 0; + int m_cols = 0; + + QSet<int> m_checkedCells; +}; + +class TestTableModelWithHeader : public TestTableModel { + + Q_OBJECT +public: + void setRowCount(int count) override + { + vData.resize(count); + TestTableModel::setRowCount(count); + } + + void setColumnCount(int count) override + { + hData.resize(count); + TestTableModel::setColumnCount(count); + } + + Q_INVOKABLE QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const override + { + const bool isHorizontal = orientation == Qt::Horizontal; + auto sectionCount = isHorizontal ? columnCount() : rowCount(); + if (section < 0 || section >= sectionCount) + return QVariant(); + switch (role) { + case Qt::DisplayRole: + return (isHorizontal ? QString::fromLatin1("Column %1") : QString::fromLatin1("Row %1")).arg(section); + case Qt::EditRole: { + auto &data = isHorizontal ? hData : vData; + return data[section].toString(); + } + default: + return QVariant(); + } + } + + Q_INVOKABLE bool setHeaderData(int section, Qt::Orientation orientation, + const QVariant &value, int role = Qt::EditRole) override + { + qDebug() << Q_FUNC_INFO + << "section:" << section + << "orient:" << orientation + << "value:" << value + << "role:" << QAbstractItemModel::roleNames()[role]; + auto sectionCount = orientation == Qt::Horizontal ? columnCount() : rowCount(); + if (section < 0 || section >= sectionCount) + return false; + auto &data = orientation == Qt::Horizontal ? hData : vData; + data[section] = value; + emit headerDataChanged(orientation, section, section); + return true; + } + +private: + QVector<QVariant> hData, vData; +}; + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication app(argc, argv); + + qmlRegisterType<TestTableModel>("TestTableModel", 0, 1, "TestTableModel"); + qmlRegisterType<TestTableModelWithHeader>("TestTableModelWithHeader", 0, 1, "TestTableModelWithHeader"); + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + return app.exec(); +} + +#include "main.moc" diff --git a/tests/manual/headerview/main.qml b/tests/manual/headerview/main.qml new file mode 100644 index 00000000..2919f1b2 --- /dev/null +++ b/tests/manual/headerview/main.qml @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQml.Models 2.15 +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Shapes 1.15 +import QtQuick.Window 2.15 +import Qt.labs.qmlmodels 1.0 +import TestTableModelWithHeader 0.1 + +Window { + visible: true + width: 640 + height: 480 + title: qsTr("HeaderView Test") + + TestTableModelWithHeader { + id: tableModel + rowCount: 50 + columnCount: 80 + } + + TableView { + id: tableView + anchors.top: parent.top + anchors.topMargin: horizontalHeader.height + rowSpacing + anchors.left: parent.left + anchors.leftMargin: verticalHeader.width + columnSpacing + model: tableModel + rightMargin: 100 + bottomMargin: 100 + columnSpacing: 4 + rowSpacing: 4 + syncDirection: Qt.Vertical | Qt.Horizontal + implicitWidth: parent.width + columnSpacing + implicitHeight: parent.height + rowSpacing + clip: true + delegate: Rectangle { + implicitWidth: 150 + implicitHeight: 50 + color: "#e6ecf5" + + CheckBox { + anchors.fill: parent + text: model.display + checked: model.edit + leftPadding: 12 + onClicked: model.edit = checked + } + } + } + + HorizontalHeaderView { + id: horizontalHeader + objectName: "horizontalHeader" + height: contentHeight + width: syncView.width + anchors.top: parent.top + anchors.left: tableView.left + syncView: tableView + clip: true + } + + VerticalHeaderView { + id: verticalHeader + objectName: "verticalHeader" + width: contentWidth + height: syncView.height + anchors.top: tableView.top + syncView: tableView + clip: true + } + + ToolButton { + width: verticalHeader.width + height: horizontalHeader.height + onClicked: { + horizontalHeader.contentX = 0 + verticalHeader.contentY = 0 + } + } +} diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro index d23b4494..fba3c12a 100644 --- a/tests/manual/manual.pro +++ b/tests/manual/manual.pro @@ -3,6 +3,7 @@ SUBDIRS += \ buttons \ gifs \ fonts \ + headerview \ screenshots \ styles \ testbench |