diff options
Diffstat (limited to 'examples/widgets/itemviews/editabletreemodel')
9 files changed, 215 insertions, 490 deletions
diff --git a/examples/widgets/itemviews/editabletreemodel/CMakeLists.txt b/examples/widgets/itemviews/editabletreemodel/CMakeLists.txt index ddcd00b8f2..e255cdbc63 100644 --- a/examples/widgets/itemviews/editabletreemodel/CMakeLists.txt +++ b/examples/widgets/itemviews/editabletreemodel/CMakeLists.txt @@ -1,19 +1,12 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + cmake_minimum_required(VERSION 3.16) project(editabletreemodel LANGUAGES CXX) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/itemviews/editabletreemodel") +find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets) -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) +qt_standard_project_setup() qt_add_executable(editabletreemodel main.cpp @@ -27,10 +20,10 @@ set_target_properties(editabletreemodel PROPERTIES MACOSX_BUNDLE TRUE ) -target_link_libraries(editabletreemodel PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets +target_link_libraries(editabletreemodel PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Widgets ) # Resources: @@ -46,7 +39,46 @@ qt_add_resources(editabletreemodel "editabletreemodel" ) install(TARGETS editabletreemodel - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET editabletreemodel + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR +) +install(SCRIPT ${deploy_script}) + +#! [1] +# Unit Test + +include(CTest) + +qt_add_executable(editabletreemodel_tester + test.cpp + treeitem.cpp treeitem.h + treemodel.cpp treemodel.h) + +target_link_libraries(editabletreemodel_tester PRIVATE + Qt6::Core + Qt6::Test ) + +if(ANDROID) + target_link_libraries(editabletreemodel_tester PRIVATE + Qt6::Gui + ) +endif() + +qt_add_resources(editabletreemodel_tester "editabletreemodel_tester" + PREFIX + "/" + FILES + ${editabletreemodel_resource_files} +) + +add_test(NAME editabletreemodel_tester + COMMAND editabletreemodel_tester) +#! [1] diff --git a/examples/widgets/itemviews/editabletreemodel/main.cpp b/examples/widgets/itemviews/editabletreemodel/main.cpp index 5e9ff214a3..7ed4cf1dc4 100644 --- a/examples/widgets/itemviews/editabletreemodel/main.cpp +++ b/examples/widgets/itemviews/editabletreemodel/main.cpp @@ -1,63 +1,17 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "mainwindow.h" #include <QApplication> +#include <QScreen> int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(editabletreemodel); - QApplication app(argc, argv); MainWindow window; + const auto screenSize = window.screen()->availableSize(); + window.resize({screenSize.width() / 2, screenSize.height() * 2 / 3}); window.show(); - return app.exec(); + return QCoreApplication::exec(); } diff --git a/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp b/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp index 47fc232751..cf88932cdb 100644 --- a/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp +++ b/examples/widgets/itemviews/editabletreemodel/mainwindow.cpp @@ -1,58 +1,13 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "mainwindow.h" #include "treemodel.h" #include <QFile> +using namespace Qt::StringLiterals; + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { @@ -60,14 +15,15 @@ MainWindow::MainWindow(QWidget *parent) const QStringList headers({tr("Title"), tr("Description")}); - QFile file(":/default.txt"); - file.open(QIODevice::ReadOnly); - TreeModel *model = new TreeModel(headers, file.readAll(), this); + QFile file(":/default.txt"_L1); + file.open(QIODevice::ReadOnly | QIODevice::Text); + auto *model = new TreeModel(headers, QString::fromUtf8(file.readAll()), this); file.close(); view->setModel(model); for (int column = 0; column < model->columnCount(); ++column) view->resizeColumnToContents(column); + view->expandAll(); connect(exitAction, &QAction::triggered, qApp, &QCoreApplication::quit); diff --git a/examples/widgets/itemviews/editabletreemodel/mainwindow.h b/examples/widgets/itemviews/editabletreemodel/mainwindow.h index 314b0cb1fa..541f7252fd 100644 --- a/examples/widgets/itemviews/editabletreemodel/mainwindow.h +++ b/examples/widgets/itemviews/editabletreemodel/mainwindow.h @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef MAINWINDOW_H #define MAINWINDOW_H diff --git a/examples/widgets/itemviews/editabletreemodel/test.cpp b/examples/widgets/itemviews/editabletreemodel/test.cpp new file mode 100644 index 0000000000..c041fe9402 --- /dev/null +++ b/examples/widgets/itemviews/editabletreemodel/test.cpp @@ -0,0 +1,37 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "treemodel.h" + +#include <QAbstractItemModelTester> +#include <QObject> +#include <QTest> + +using namespace Qt::StringLiterals; + +//! [1] +class TestEditableTreeModel : public QObject +{ + Q_OBJECT + +private slots: + void testTreeModel(); +}; + +void TestEditableTreeModel::testTreeModel() +{ + constexpr auto fileName = ":/default.txt"_L1; + QFile file(fileName); + QVERIFY2(file.open(QIODevice::ReadOnly | QIODevice::Text), + qPrintable(fileName + " cannot be opened: "_L1 + file.errorString())); + + const QStringList headers{"column1"_L1, "column2"_L1}; + TreeModel model(headers, QString::fromUtf8(file.readAll())); + + QAbstractItemModelTester tester(&model); +} + +QTEST_APPLESS_MAIN(TestEditableTreeModel) + +#include "test.moc" +//! [1] diff --git a/examples/widgets/itemviews/editabletreemodel/treeitem.cpp b/examples/widgets/itemviews/editabletreemodel/treeitem.cpp index e82c84a424..42d911823d 100644 --- a/examples/widgets/itemviews/editabletreemodel/treeitem.cpp +++ b/examples/widgets/itemviews/editabletreemodel/treeitem.cpp @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause /* treeitem.cpp @@ -57,76 +10,74 @@ #include "treeitem.h" //! [0] -TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent) - : itemData(data), parentItem(parent) +TreeItem::TreeItem(QVariantList data, TreeItem *parent) + : itemData(std::move(data)), m_parentItem(parent) {} //! [0] //! [1] -TreeItem::~TreeItem() +TreeItem *TreeItem::child(int number) { - qDeleteAll(childItems); + return (number >= 0 && number < childCount()) + ? m_childItems.at(number).get() : nullptr; } //! [1] //! [2] -TreeItem *TreeItem::child(int number) +int TreeItem::childCount() const { - if (number < 0 || number >= childItems.size()) - return nullptr; - return childItems.at(number); + return int(m_childItems.size()); } //! [2] //! [3] -int TreeItem::childCount() const +int TreeItem::row() const { - return childItems.count(); + if (!m_parentItem) + return 0; + const auto it = std::find_if(m_parentItem->m_childItems.cbegin(), m_parentItem->m_childItems.cend(), + [this](const std::unique_ptr<TreeItem> &treeItem) { + return treeItem.get() == this; + }); + + if (it != m_parentItem->m_childItems.cend()) + return std::distance(m_parentItem->m_childItems.cbegin(), it); + Q_ASSERT(false); // should not happen + return -1; } //! [3] //! [4] -int TreeItem::childNumber() const +int TreeItem::columnCount() const { - if (parentItem) - return parentItem->childItems.indexOf(const_cast<TreeItem*>(this)); - return 0; + return int(itemData.count()); } //! [4] //! [5] -int TreeItem::columnCount() const +QVariant TreeItem::data(int column) const { - return itemData.count(); + return itemData.value(column); } //! [5] //! [6] -QVariant TreeItem::data(int column) const -{ - if (column < 0 || column >= itemData.size()) - return QVariant(); - return itemData.at(column); -} -//! [6] - -//! [7] bool TreeItem::insertChildren(int position, int count, int columns) { - if (position < 0 || position > childItems.size()) + if (position < 0 || position > qsizetype(m_childItems.size())) return false; for (int row = 0; row < count; ++row) { - QList<QVariant> data(columns); - TreeItem *item = new TreeItem(data, this); - childItems.insert(position, item); + QVariantList data(columns); + m_childItems.insert(m_childItems.cbegin() + position, + std::make_unique<TreeItem>(data, this)); } return true; } -//! [7] +//! [6] -//! [8] +//! [7] bool TreeItem::insertColumns(int position, int columns) { if (position < 0 || position > itemData.size()) @@ -135,32 +86,32 @@ bool TreeItem::insertColumns(int position, int columns) for (int column = 0; column < columns; ++column) itemData.insert(position, QVariant()); - for (TreeItem *child : qAsConst(childItems)) + for (auto &child : std::as_const(m_childItems)) child->insertColumns(position, columns); return true; } -//! [8] +//! [7] -//! [9] +//! [8] TreeItem *TreeItem::parent() { - return parentItem; + return m_parentItem; } -//! [9] +//! [8] -//! [10] +//! [9] bool TreeItem::removeChildren(int position, int count) { - if (position < 0 || position + count > childItems.size()) + if (position < 0 || position + count > qsizetype(m_childItems.size())) return false; for (int row = 0; row < count; ++row) - delete childItems.takeAt(position); + m_childItems.erase(m_childItems.cbegin() + position); return true; } -//! [10] +//! [9] bool TreeItem::removeColumns(int position, int columns) { @@ -170,13 +121,13 @@ bool TreeItem::removeColumns(int position, int columns) for (int column = 0; column < columns; ++column) itemData.remove(position); - for (TreeItem *child : qAsConst(childItems)) + for (auto &child : std::as_const(m_childItems)) child->removeColumns(position, columns); return true; } -//! [11] +//! [10] bool TreeItem::setData(int column, const QVariant &value) { if (column < 0 || column >= itemData.size()) @@ -185,4 +136,4 @@ bool TreeItem::setData(int column, const QVariant &value) itemData[column] = value; return true; } -//! [11] +//! [10] diff --git a/examples/widgets/itemviews/editabletreemodel/treeitem.h b/examples/widgets/itemviews/editabletreemodel/treeitem.h index b23697efe3..8910312ade 100644 --- a/examples/widgets/itemviews/editabletreemodel/treeitem.h +++ b/examples/widgets/itemviews/editabletreemodel/treeitem.h @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef TREEITEM_H #define TREEITEM_H @@ -58,8 +11,7 @@ class TreeItem { public: - explicit TreeItem(const QList<QVariant> &data, TreeItem *parent = nullptr); - ~TreeItem(); + explicit TreeItem(QVariantList data, TreeItem *parent = nullptr); TreeItem *child(int number); int childCount() const; @@ -70,13 +22,13 @@ public: TreeItem *parent(); bool removeChildren(int position, int count); bool removeColumns(int position, int columns); - int childNumber() const; + int row() const; bool setData(int column, const QVariant &value); private: - QList<TreeItem *> childItems; - QList<QVariant> itemData; - TreeItem *parentItem; + std::vector<std::unique_ptr<TreeItem>> m_childItems; + QVariantList itemData; + TreeItem *m_parentItem; }; //! [0] diff --git a/examples/widgets/itemviews/editabletreemodel/treemodel.cpp b/examples/widgets/itemviews/editabletreemodel/treemodel.cpp index e8ca2afffd..6511b06780 100644 --- a/examples/widgets/itemviews/editabletreemodel/treemodel.cpp +++ b/examples/widgets/itemviews/editabletreemodel/treemodel.cpp @@ -1,76 +1,26 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "treemodel.h" #include "treeitem.h" -#include <QtWidgets> +using namespace Qt::StringLiterals; //! [0] TreeModel::TreeModel(const QStringList &headers, const QString &data, QObject *parent) : QAbstractItemModel(parent) { - QList<QVariant> rootData; + QVariantList rootData; for (const QString &header : headers) rootData << header; - rootItem = new TreeItem(rootData); - setupModelData(data.split('\n'), rootItem); + rootItem = std::make_unique<TreeItem>(rootData); + setupModelData(QStringView{data}.split(u'\n')); } //! [0] //! [1] -TreeModel::~TreeModel() -{ - delete rootItem; -} +TreeModel::~TreeModel() = default; //! [1] //! [2] @@ -84,10 +34,10 @@ int TreeModel::columnCount(const QModelIndex &parent) const QVariant TreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) - return QVariant(); + return {}; if (role != Qt::DisplayRole && role != Qt::EditRole) - return QVariant(); + return {}; TreeItem *item = getItem(index); @@ -108,39 +58,35 @@ Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const TreeItem *TreeModel::getItem(const QModelIndex &index) const { if (index.isValid()) { - TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); - if (item) + if (auto *item = static_cast<TreeItem*>(index.internalPointer())) return item; } - return rootItem; + return rootItem.get(); } //! [4] QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) - return rootItem->data(section); - - return QVariant(); + return (orientation == Qt::Horizontal && role == Qt::DisplayRole) + ? rootItem->data(section) : QVariant{}; } //! [5] QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { if (parent.isValid() && parent.column() != 0) - return QModelIndex(); + return {}; //! [5] //! [6] TreeItem *parentItem = getItem(parent); if (!parentItem) - return QModelIndex(); + return {}; - TreeItem *childItem = parentItem->child(row); - if (childItem) + if (auto *childItem = parentItem->child(row)) return createIndex(row, column, childItem); - return QModelIndex(); + return {}; } //! [6] @@ -172,15 +118,13 @@ bool TreeModel::insertRows(int position, int rows, const QModelIndex &parent) QModelIndex TreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) - return QModelIndex(); + return {}; TreeItem *childItem = getItem(index); TreeItem *parentItem = childItem ? childItem->parent() : nullptr; - if (parentItem == rootItem || !parentItem) - return QModelIndex(); - - return createIndex(parentItem->childNumber(), 0, parentItem); + return (parentItem != rootItem.get() && parentItem != nullptr) + ? createIndex(parentItem->row(), 0, parentItem) : QModelIndex{}; } //! [7] @@ -249,55 +193,46 @@ bool TreeModel::setHeaderData(int section, Qt::Orientation orientation, return result; } -void TreeModel::setupModelData(const QStringList &lines, TreeItem *parent) +void TreeModel::setupModelData(const QList<QStringView> &lines) { - QList<TreeItem *> parents; - QList<int> indentations; - parents << parent; - indentations << 0; - - int number = 0; - - while (number < lines.count()) { - int position = 0; - while (position < lines[number].length()) { - if (lines[number].at(position) != ' ') - break; - ++position; - } + struct ParentIndentation + { + TreeItem *parent; + qsizetype indentation; + }; - const QString lineData = lines[number].mid(position).trimmed(); + QList<ParentIndentation> state{{rootItem.get(), 0}}; + for (const auto &line : lines) { + qsizetype position = 0; + for ( ; position < line.length() && line.at(position).isSpace(); ++position) { + } + + const QStringView lineData = line.sliced(position).trimmed(); if (!lineData.isEmpty()) { // Read the column data from the rest of the line. - const QStringList columnStrings = - lineData.split(QLatin1Char('\t'), Qt::SkipEmptyParts); - QList<QVariant> columnData; - columnData.reserve(columnStrings.size()); - for (const QString &columnString : columnStrings) - columnData << columnString; - - if (position > indentations.last()) { + const auto columnStrings = lineData.split(u'\t', Qt::SkipEmptyParts); + QVariantList columnData; + columnData.reserve(columnStrings.count()); + for (const auto &columnString : columnStrings) + columnData << columnString.toString(); + + if (position > state.constLast().indentation) { // The last child of the current parent is now the new parent // unless the current parent has no children. - - if (parents.last()->childCount() > 0) { - parents << parents.last()->child(parents.last()->childCount()-1); - indentations << position; - } + auto *lastParent = state.constLast().parent; + if (lastParent->childCount() > 0) + state.append({lastParent->child(lastParent->childCount() - 1), position}); } else { - while (position < indentations.last() && parents.count() > 0) { - parents.pop_back(); - indentations.pop_back(); - } + while (position < state.constLast().indentation && !state.isEmpty()) + state.removeLast(); } // Append a new item to the current parent's list of children. - TreeItem *parent = parents.last(); + auto *parent = state.constLast().parent; parent->insertChildren(parent->childCount(), 1, rootItem->columnCount()); for (int column = 0; column < columnData.size(); ++column) - parent->child(parent->childCount() - 1)->setData(column, columnData[column]); + parent->child(parent->childCount() - 1)->setData(column, columnData.at(column)); } - ++number; } } diff --git a/examples/widgets/itemviews/editabletreemodel/treemodel.h b/examples/widgets/itemviews/editabletreemodel/treemodel.h index 8419f9cb9d..4f781c8144 100644 --- a/examples/widgets/itemviews/editabletreemodel/treemodel.h +++ b/examples/widgets/itemviews/editabletreemodel/treemodel.h @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef TREEMODEL_H #define TREEMODEL_H @@ -63,9 +16,11 @@ class TreeModel : public QAbstractItemModel Q_OBJECT public: + Q_DISABLE_COPY_MOVE(TreeModel) + TreeModel(const QStringList &headers, const QString &data, QObject *parent = nullptr); - ~TreeModel(); + ~TreeModel() override; //! [0] //! [1] QVariant data(const QModelIndex &index, int role) const override; @@ -73,11 +28,11 @@ public: int role = Qt::DisplayRole) const override; QModelIndex index(int row, int column, - const QModelIndex &parent = QModelIndex()) const override; + const QModelIndex &parent = {}) const override; QModelIndex parent(const QModelIndex &index) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; + int rowCount(const QModelIndex &parent = {}) const override; + int columnCount(const QModelIndex &parent = {}) const override; //! [1] //! [2] @@ -88,19 +43,19 @@ public: const QVariant &value, int role = Qt::EditRole) override; bool insertColumns(int position, int columns, - const QModelIndex &parent = QModelIndex()) override; + const QModelIndex &parent = {}) override; bool removeColumns(int position, int columns, - const QModelIndex &parent = QModelIndex()) override; + const QModelIndex &parent = {}) override; bool insertRows(int position, int rows, - const QModelIndex &parent = QModelIndex()) override; + const QModelIndex &parent = {}) override; bool removeRows(int position, int rows, - const QModelIndex &parent = QModelIndex()) override; + const QModelIndex &parent = {}) override; private: - void setupModelData(const QStringList &lines, TreeItem *parent); + void setupModelData(const QList<QStringView> &lines); TreeItem *getItem(const QModelIndex &index) const; - TreeItem *rootItem; + std::unique_ptr<TreeItem> rootItem; }; //! [2] |