summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/itemviews
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/widgets/itemviews')
-rw-r--r--tests/auto/widgets/itemviews/CMakeLists.txt21
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/CMakeLists.txt16
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro2
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp102
-rw-r--r--tests/auto/widgets/itemviews/qcolumnview/CMakeLists.txt18
-rw-r--r--tests/auto/widgets/itemviews/qdatawidgetmapper/CMakeLists.txt13
-rw-r--r--tests/auto/widgets/itemviews/qdirmodel/CMakeLists.txt49
-rw-r--r--tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qfileiconprovider/CMakeLists.txt13
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/CMakeLists.txt18
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qitemdelegate/CMakeLists.txt22
-rw-r--r--tests/auto/widgets/itemviews/qitemeditorfactory/CMakeLists.txt13
-rw-r--r--tests/auto/widgets/itemviews/qitemview/CMakeLists.txt13
-rw-r--r--tests/auto/widgets/itemviews/qlistview/CMakeLists.txt25
-rw-r--r--tests/auto/widgets/itemviews/qlistwidget/CMakeLists.txt16
-rw-r--r--tests/auto/widgets/itemviews/qtableview/CMakeLists.txt17
-rw-r--r--tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp132
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/CMakeLists.txt13
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/CMakeLists.txt18
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp114
-rw-r--r--tests/auto/widgets/itemviews/qtreewidget/CMakeLists.txt13
-rw-r--r--tests/auto/widgets/itemviews/qtreewidgetitemiterator/CMakeLists.txt13
23 files changed, 661 insertions, 4 deletions
diff --git a/tests/auto/widgets/itemviews/CMakeLists.txt b/tests/auto/widgets/itemviews/CMakeLists.txt
new file mode 100644
index 0000000000..e7dc78b18c
--- /dev/null
+++ b/tests/auto/widgets/itemviews/CMakeLists.txt
@@ -0,0 +1,21 @@
+# Generated from itemviews.pro.
+
+add_subdirectory(qabstractitemview)
+add_subdirectory(qdatawidgetmapper)
+add_subdirectory(qdirmodel)
+add_subdirectory(qfileiconprovider)
+add_subdirectory(qheaderview)
+add_subdirectory(qitemdelegate)
+add_subdirectory(qitemeditorfactory)
+add_subdirectory(qitemview)
+add_subdirectory(qlistview)
+add_subdirectory(qtableview)
+add_subdirectory(qtablewidget)
+add_subdirectory(qtreeview)
+add_subdirectory(qtreewidget)
+add_subdirectory(qtreewidgetitemiterator)
+
+if(QT_FEATURE_private_tests)
+ add_subdirectory(qcolumnview)
+ add_subdirectory(qlistwidget)
+endif()
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/CMakeLists.txt b/tests/auto/widgets/itemviews/qabstractitemview/CMakeLists.txt
new file mode 100644
index 0000000000..2fc8c14eb6
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qabstractitemview/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Generated from qabstractitemview.pro.
+
+#####################################################################
+## tst_qabstractitemview Test:
+#####################################################################
+
+add_qt_test(tst_qabstractitemview
+ SOURCES
+ tst_qabstractitemview.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::TestPrivate
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro b/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro
index 809a996324..b9091a134e 100644
--- a/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro
+++ b/tests/auto/widgets/itemviews/qabstractitemview/qabstractitemview.pro
@@ -1,4 +1,4 @@
CONFIG += testcase
TARGET = tst_qabstractitemview
-QT += widgets testlib testlib-private gui-private
+QT += widgets testlib testlib-private gui-private widgets-private
SOURCES += tst_qabstractitemview.cpp
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
index 0bdf61e1e1..ba4c1473e8 100644
--- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
+++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
@@ -51,6 +51,7 @@
#include <QTest>
#include <QVBoxLayout>
#include <QtTest/private/qtesthelpers_p.h>
+#include <private/qabstractitemview_p.h>
Q_DECLARE_METATYPE(Qt::ItemFlags);
@@ -115,6 +116,9 @@ private slots:
void setCurrentIndex_data();
void setCurrentIndex();
+ void checkIntersectedRect_data();
+ void checkIntersectedRect();
+
void task221955_selectedEditor();
void task250754_fontChange();
void task200665_itemEntered();
@@ -469,7 +473,8 @@ void tst_QAbstractItemView::basic_tests(QAbstractItemView *view)
view->setCurrentIndex(QModelIndex());
// protected methods
- view->dataChanged(QModelIndex(), QModelIndex());
+ // will assert because an invalid index is passed
+ //view->dataChanged(QModelIndex(), QModelIndex());
view->rowsInserted(QModelIndex(), -1, -1);
view->rowsAboutToBeRemoved(QModelIndex(), -1, -1);
view->selectionChanged(QItemSelection(), QItemSelection());
@@ -1099,6 +1104,101 @@ void tst_QAbstractItemView::setCurrentIndex()
QVERIFY(view->currentIndex() == model->index(result ? 1 : 0, 0));
}
+void tst_QAbstractItemView::checkIntersectedRect_data()
+{
+ auto createModel = [](int rowCount) -> QStandardItemModel*
+ {
+ QStandardItemModel *model = new QStandardItemModel;
+ for (int i = 0; i < rowCount; ++i) {
+ const QList<QStandardItem *> sil({new QStandardItem(QLatin1String("Row %1 Item").arg(i)),
+ new QStandardItem(QLatin1String("2nd column"))});
+ model->appendRow(sil);
+ }
+ return model;
+ };
+ QTest::addColumn<QStandardItemModel *>("model");
+ QTest::addColumn<QVector<QModelIndex>>("changedIndexes");
+ QTest::addColumn<bool>("isEmpty");
+ {
+ auto model = createModel(5);
+ QTest::newRow("multiple columns") << model
+ << QVector<QModelIndex>({model->index(0, 0),
+ model->index(0, 1)})
+ << false;
+ }
+ {
+ auto model = createModel(5);
+ QTest::newRow("multiple rows") << model
+ << QVector<QModelIndex>({model->index(0, 0),
+ model->index(1, 0),
+ model->index(2, 0)})
+ << false;
+ }
+ {
+ auto model = createModel(5);
+ QTest::newRow("hidden rows") << model
+ << QVector<QModelIndex>({model->index(3, 0),
+ model->index(4, 0)})
+ << true;
+ }
+ {
+ auto model = createModel(500);
+ QTest::newRow("rows outside viewport") << model
+ << QVector<QModelIndex>({model->index(498, 0),
+ model->index(499, 0)})
+ << true;
+ }
+}
+
+void tst_QAbstractItemView::checkIntersectedRect()
+{
+ QFETCH(QStandardItemModel *, model);
+ QFETCH(const QVector<QModelIndex>, changedIndexes);
+ QFETCH(bool, isEmpty);
+
+ class TableView : public QTableView
+ {
+ public:
+ void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override
+ {
+ QTableView::dataChanged(topLeft, bottomRight, roles);
+ // we want to check the base class implementation here!
+ QAbstractItemViewPrivate *av = static_cast<QAbstractItemViewPrivate*>(qt_widget_private(this));
+ m_intersectecRect = av->intersectedRect(av->viewport->rect(), topLeft, bottomRight);
+ }
+ mutable QRect m_intersectecRect;
+ };
+
+ TableView view;
+ model->setParent(&view);
+ view.setModel(model);
+ view.resize(400, 400);
+ view.show();
+ view.setRowHidden(3, true);
+ view.setRowHidden(4, true);
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
+
+ view.m_intersectecRect = QRect();
+ emit view.model()->dataChanged(changedIndexes.first(), changedIndexes.last());
+ if (isEmpty) {
+ QVERIFY(view.m_intersectecRect.isEmpty());
+ } else {
+ const auto parent = changedIndexes.first().parent();
+ const int rCount = view.model()->rowCount(parent);
+ const int cCount = view.model()->columnCount(parent);
+ for (int r = 0; r < rCount; ++r) {
+ for (int c = 0; c < cCount; ++c) {
+ const QModelIndex &idx = view.model()->index(r, c, parent);
+ const auto rect = view.visualRect(idx);
+ if (changedIndexes.contains(idx))
+ QVERIFY(view.m_intersectecRect.contains(rect));
+ else
+ QVERIFY(!view.m_intersectecRect.contains(rect));
+ }
+ }
+ }
+}
+
void tst_QAbstractItemView::task221955_selectedEditor()
{
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))
diff --git a/tests/auto/widgets/itemviews/qcolumnview/CMakeLists.txt b/tests/auto/widgets/itemviews/qcolumnview/CMakeLists.txt
new file mode 100644
index 0000000000..d33e3b9c2e
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qcolumnview/CMakeLists.txt
@@ -0,0 +1,18 @@
+# Generated from qcolumnview.pro.
+
+#####################################################################
+## tst_qcolumnview Test:
+#####################################################################
+
+add_qt_test(tst_qcolumnview
+ SOURCES
+ ../../../../shared/fakedirmodel.h
+ tst_qcolumnview.cpp
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::TestPrivate
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
diff --git a/tests/auto/widgets/itemviews/qdatawidgetmapper/CMakeLists.txt b/tests/auto/widgets/itemviews/qdatawidgetmapper/CMakeLists.txt
new file mode 100644
index 0000000000..f3e4af0c23
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qdatawidgetmapper/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from qdatawidgetmapper.pro.
+
+#####################################################################
+## tst_qdatawidgetmapper Test:
+#####################################################################
+
+add_qt_test(tst_qdatawidgetmapper
+ SOURCES
+ tst_qdatawidgetmapper.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)
diff --git a/tests/auto/widgets/itemviews/qdirmodel/CMakeLists.txt b/tests/auto/widgets/itemviews/qdirmodel/CMakeLists.txt
new file mode 100644
index 0000000000..d47cc3457d
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qdirmodel/CMakeLists.txt
@@ -0,0 +1,49 @@
+# Generated from qdirmodel.pro.
+
+#####################################################################
+## tst_qdirmodel Test:
+#####################################################################
+
+add_qt_test(tst_qdirmodel
+ SOURCES
+ ../../../../shared/emulationdetector.h
+ tst_qdirmodel.cpp
+ INCLUDE_DIRECTORIES
+ ../../../../shared
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)
+
+## Scopes:
+#####################################################################
+
+extend_target(tst_qdirmodel CONDITION ANDROID
+ DEFINES
+ SRCDIR=\\\"./\\\"
+)
+
+extend_target(tst_qdirmodel CONDITION NOT ANDROID
+ DEFINES
+ SRCDIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/\\\"
+)
+
+if(ANDROID AND NOT ANDROID_EMBEDDED)
+ # Resources:
+ set(testdata_resource_files
+ "dirtest/test1/dummy"
+ "dirtest/test1/test"
+ "test/file01.tst"
+ "test/file02.tst"
+ "test/file03.tst"
+ "test/file04.tst"
+ "tst_qdirmodel.cpp"
+ )
+
+ add_qt_resource(tst_qdirmodel "testdata"
+ PREFIX
+ "/android_testdata"
+ FILES
+ ${testdata_resource_files}
+ )
+endif()
diff --git a/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp b/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
index 546b2ab3a8..925c578300 100644
--- a/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
+++ b/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
@@ -713,7 +713,7 @@ void tst_QDirModel::roleNames()
QVERIFY(roles.contains(role));
QFETCH(QByteArray, roleName);
- QCOMPARE(roles.values(role).count(), 1);
+ QCOMPARE(roles.contains(role), true);
QCOMPARE(roles.value(role), roleName);
}
diff --git a/tests/auto/widgets/itemviews/qfileiconprovider/CMakeLists.txt b/tests/auto/widgets/itemviews/qfileiconprovider/CMakeLists.txt
new file mode 100644
index 0000000000..024519ad9c
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qfileiconprovider/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from qfileiconprovider.pro.
+
+#####################################################################
+## tst_qfileiconprovider Test:
+#####################################################################
+
+add_qt_test(tst_qfileiconprovider
+ SOURCES
+ tst_qfileiconprovider.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)
diff --git a/tests/auto/widgets/itemviews/qheaderview/CMakeLists.txt b/tests/auto/widgets/itemviews/qheaderview/CMakeLists.txt
new file mode 100644
index 0000000000..8949ac4957
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qheaderview/CMakeLists.txt
@@ -0,0 +1,18 @@
+# Generated from qheaderview.pro.
+
+#####################################################################
+## tst_qheaderview Test:
+#####################################################################
+
+add_qt_test(tst_qheaderview
+ SOURCES
+ tst_qheaderview.cpp
+ DEFINES
+ QT_DISABLE_DEPRECATED_BEFORE=0
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
index d5813d64ff..bb098f32c2 100644
--- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
@@ -1744,7 +1744,7 @@ void tst_QHeaderView::restoreQt4State()
QCOMPARE(h2.length(), old_length);
QCOMPARE(h2.saveState(), old_state);
#else
- QSKIP("Qt4 compatibility no longer needed in Qt6")
+ QSKIP("Qt4 compatibility no longer needed in Qt6");
#endif
}
diff --git a/tests/auto/widgets/itemviews/qitemdelegate/CMakeLists.txt b/tests/auto/widgets/itemviews/qitemdelegate/CMakeLists.txt
new file mode 100644
index 0000000000..af1bac9ff0
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qitemdelegate/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Generated from qitemdelegate.pro.
+
+#####################################################################
+## tst_qitemdelegate Test:
+#####################################################################
+
+add_qt_test(tst_qitemdelegate
+ SOURCES
+ tst_qitemdelegate.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
+
+## Scopes:
+#####################################################################
+
+extend_target(tst_qitemdelegate CONDITION WIN32 AND NOT WINRT
+ PUBLIC_LIBRARIES
+ user32
+)
diff --git a/tests/auto/widgets/itemviews/qitemeditorfactory/CMakeLists.txt b/tests/auto/widgets/itemviews/qitemeditorfactory/CMakeLists.txt
new file mode 100644
index 0000000000..4dfb46ff4d
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qitemeditorfactory/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from qitemeditorfactory.pro.
+
+#####################################################################
+## tst_qitemeditorfactory Test:
+#####################################################################
+
+add_qt_test(tst_qitemeditorfactory
+ SOURCES
+ tst_qitemeditorfactory.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)
diff --git a/tests/auto/widgets/itemviews/qitemview/CMakeLists.txt b/tests/auto/widgets/itemviews/qitemview/CMakeLists.txt
new file mode 100644
index 0000000000..b27f456246
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qitemview/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from qitemview.pro.
+
+#####################################################################
+## tst_qitemview Test:
+#####################################################################
+
+add_qt_test(tst_qitemview
+ SOURCES
+ tst_qitemview.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)
diff --git a/tests/auto/widgets/itemviews/qlistview/CMakeLists.txt b/tests/auto/widgets/itemviews/qlistview/CMakeLists.txt
new file mode 100644
index 0000000000..07c290128e
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qlistview/CMakeLists.txt
@@ -0,0 +1,25 @@
+# Generated from qlistview.pro.
+
+#####################################################################
+## tst_qlistview Test:
+#####################################################################
+
+add_qt_test(tst_qlistview
+ SOURCES
+ tst_qlistview.cpp
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::TestPrivate
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
+
+## Scopes:
+#####################################################################
+
+extend_target(tst_qlistview CONDITION WIN32 AND NOT WINRT
+ PUBLIC_LIBRARIES
+ user32
+)
diff --git a/tests/auto/widgets/itemviews/qlistwidget/CMakeLists.txt b/tests/auto/widgets/itemviews/qlistwidget/CMakeLists.txt
new file mode 100644
index 0000000000..aebcb4c49e
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qlistwidget/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Generated from qlistwidget.pro.
+
+#####################################################################
+## tst_qlistwidget Test:
+#####################################################################
+
+add_qt_test(tst_qlistwidget
+ SOURCES
+ tst_qlistwidget.cpp
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
diff --git a/tests/auto/widgets/itemviews/qtableview/CMakeLists.txt b/tests/auto/widgets/itemviews/qtableview/CMakeLists.txt
new file mode 100644
index 0000000000..20e50d2de3
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qtableview/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Generated from qtableview.pro.
+
+#####################################################################
+## tst_qtableview Test:
+#####################################################################
+
+add_qt_test(tst_qtableview
+ SOURCES
+ tst_qtableview.cpp
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::TestPrivate
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
index ea3eb5fd0c..ccc6997f26 100644
--- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
+++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
@@ -243,6 +243,14 @@ public:
verticalHeader()->setMinimumSectionSize(0);
}
+ void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override
+ {
+ QTableView::dataChanged(topLeft, bottomRight, roles);
+ QTableViewPrivate *av = static_cast<QTableViewPrivate*>(qt_widget_private(this));
+ m_intersectecRect = av->intersectedRect(av->viewport->rect(), topLeft, bottomRight);
+ }
+ mutable QRect m_intersectecRect;
+
using QTableView::moveCursor;
using QTableView::isIndexHidden;
using QTableView::setSelection;
@@ -331,8 +339,10 @@ private slots:
void selectColumn_data();
void selectColumn();
+#if QT_CONFIG(shortcut)
void selectall_data();
void selectall();
+#endif
void visualRect_data();
void visualRect();
@@ -400,6 +410,9 @@ private slots:
void selectionSignal();
void setCurrentIndex();
+ void checkIntersectedRect_data();
+ void checkIntersectedRect();
+
// task-specific tests:
void task173773_updateVerticalHeader();
void task227953_setRootIndex();
@@ -1843,6 +1856,8 @@ void tst_QTableView::selectColumn()
QCOMPARE(view.selectionModel()->selectedIndexes().at(i).column(), column);
}
+#if QT_CONFIG(shortcut)
+
void tst_QTableView::selectall_data()
{
QTest::addColumn<int>("rowCount");
@@ -1999,6 +2014,8 @@ void tst_QTableView::selectall()
QCOMPARE(view.selectedIndexes().count(), 0);
}
+#endif // QT_CONFIG(shortcut)
+
void tst_QTableView::visualRect_data()
{
QTest::addColumn<int>("rowCount");
@@ -3836,6 +3853,121 @@ void tst_QTableView::setCurrentIndex()
QCOMPARE(model.submit_count, 4);
}
+void tst_QTableView::checkIntersectedRect_data()
+{
+ QTest::addColumn<QtTestTableModel *>("model");
+ QTest::addColumn<QVector<QModelIndex>>("changedIndexes");
+ QTest::addColumn<bool>("isEmpty");
+ QTest::addColumn<bool>("swapFirstAndLastIndexRow"); // for QHeaderView::sectionsMoved()
+ QTest::addColumn<bool>("swapFirstAndLastIndexColumn"); // for QHeaderView::sectionsMoved()
+ QTest::addColumn<Qt::LayoutDirection>("layoutDirection");
+ QTest::addColumn<int>("hiddenRow");
+ QTest::addColumn<int>("hiddenCol");
+ const auto testName = [](const QByteArray &prefix, Qt::LayoutDirection dir, bool r, bool c)
+ {
+ const char *strDir = dir == Qt::LeftToRight ? ", LeftToRight" : ", RightToLeft";
+ const char *strRow = r ? ", rowsSwapped" : "";
+ const char *strCol = c ? ", colsSwapped" : "";
+ return prefix + strDir + strRow + strCol;
+ };
+ for (int i = 0; i < 2; ++i) {
+ const Qt::LayoutDirection dir(i == 0 ? Qt::LeftToRight : Qt::RightToLeft);
+ for (int j = 0; j < 4; ++j) {
+ const bool swapRow = ((j & 1) == 1);
+ const bool swapColumn = ((j & 2) == 2);
+ {
+ QtTestTableModel *model = new QtTestTableModel(10, 3);
+ QTest::newRow(testName("multiple columns", dir, swapRow, swapColumn).data())
+ << model
+ << QVector<QModelIndex>({model->index(0, 0),
+ model->index(0, 1)})
+ << false << swapRow << swapColumn << dir << -1 << -1;
+ }
+ {
+ QtTestTableModel *model = new QtTestTableModel(10, 3);
+ QTest::newRow(testName("multiple rows", dir, swapRow, swapColumn).data())
+ << model
+ << QVector<QModelIndex>({model->index(0, 0),
+ model->index(1, 0),
+ model->index(2, 0)})
+ << false << swapRow << swapColumn << dir << -1 << -1;
+ }
+ {
+ QtTestTableModel *model = new QtTestTableModel(10, 3);
+ QTest::newRow(testName("hidden row", dir, swapRow, swapColumn).data())
+ << model
+ << QVector<QModelIndex>({model->index(3, 0),
+ model->index(3, 1)})
+ << true << swapRow << swapColumn << dir << 3 << -1;
+ }
+ {
+ QtTestTableModel *model = new QtTestTableModel(50, 2);
+ QTest::newRow(testName("row outside viewport", dir, swapRow, swapColumn).data())
+ << model
+ << QVector<QModelIndex>({model->index(49, 0),
+ model->index(49, 1)})
+ << true << swapRow << swapColumn << dir << -1 << -1;
+ }
+ }
+ }
+}
+
+void tst_QTableView::checkIntersectedRect()
+{
+ QFETCH(QtTestTableModel *, model);
+ QFETCH(const QVector<QModelIndex>, changedIndexes);
+ QFETCH(bool, isEmpty);
+ QFETCH(bool, swapFirstAndLastIndexRow);
+ QFETCH(bool, swapFirstAndLastIndexColumn);
+ QFETCH(Qt::LayoutDirection, layoutDirection);
+ QFETCH(int, hiddenRow);
+ QFETCH(int, hiddenCol);
+
+ QtTestTableView view;
+ model->setParent(&view);
+ view.setLayoutDirection(layoutDirection);
+ view.setModel(model);
+ view.resize(400, 400);
+ view.show();
+ if (hiddenRow >= 0)
+ view.hideRow(hiddenRow);
+ if (hiddenCol >= 0)
+ view.hideRow(hiddenCol);
+ if (swapFirstAndLastIndexRow)
+ view.verticalHeader()->swapSections(changedIndexes.first().row(), changedIndexes.last().row());
+ if (swapFirstAndLastIndexColumn)
+ view.horizontalHeader()->swapSections(changedIndexes.first().column(), changedIndexes.last().column());
+
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
+
+ const auto toString = [](const QModelIndex &idx)
+ {
+ return QStringLiteral("idx: %1/%2").arg(idx.row()).arg(idx.column());
+ };
+
+ view.m_intersectecRect = QRect();
+ emit view.model()->dataChanged(changedIndexes.first(), changedIndexes.last());
+ if (isEmpty) {
+ QVERIFY(view.m_intersectecRect.isEmpty());
+ } else if (!changedIndexes.first().isValid()) {
+ QCOMPARE(view.m_intersectecRect, view.viewport()->rect());
+ } else {
+ const auto parent = changedIndexes.first().parent();
+ const int rCount = view.model()->rowCount(parent);
+ const int cCount = view.model()->columnCount(parent);
+ for (int r = 0; r < rCount; ++r) {
+ for (int c = 0; c < cCount; ++c) {
+ const QModelIndex &idx = view.model()->index(r, c, parent);
+ const auto rect = view.visualRect(idx);
+ if (changedIndexes.contains(idx))
+ QVERIFY2(view.m_intersectecRect.contains(rect), qPrintable(toString(idx)));
+ else
+ QVERIFY2(!view.m_intersectecRect.contains(rect), qPrintable(toString(idx)));
+ }
+ }
+ }
+}
+
class task173773_EventFilter : public QObject
{
int paintEventCount_ = 0;
diff --git a/tests/auto/widgets/itemviews/qtablewidget/CMakeLists.txt b/tests/auto/widgets/itemviews/qtablewidget/CMakeLists.txt
new file mode 100644
index 0000000000..66344e9d32
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qtablewidget/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from qtablewidget.pro.
+
+#####################################################################
+## tst_qtablewidget Test:
+#####################################################################
+
+add_qt_test(tst_qtablewidget
+ SOURCES
+ tst_qtablewidget.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)
diff --git a/tests/auto/widgets/itemviews/qtreeview/CMakeLists.txt b/tests/auto/widgets/itemviews/qtreeview/CMakeLists.txt
new file mode 100644
index 0000000000..40a6a1a6d6
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qtreeview/CMakeLists.txt
@@ -0,0 +1,18 @@
+# Generated from qtreeview.pro.
+
+#####################################################################
+## tst_qtreeview Test:
+#####################################################################
+
+add_qt_test(tst_qtreeview
+ SOURCES
+ ../../../../shared/fakedirmodel.h
+ tst_qtreeview.cpp
+ PUBLIC_LIBRARIES
+ Qt::CorePrivate
+ Qt::Gui
+ Qt::GuiPrivate
+ Qt::TestPrivate
+ Qt::Widgets
+ Qt::WidgetsPrivate
+)
diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
index 339f5b39e6..760dcac608 100644
--- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
@@ -89,6 +89,13 @@ public:
QTreeView::paintEvent(event);
wasPainted = true;
}
+ void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()) override
+ {
+ QTreeView::dataChanged(topLeft, bottomRight, roles);
+ QTreeViewPrivate *av = static_cast<QTreeViewPrivate*>(qt_widget_private(this));
+ m_intersectecRect = av->intersectedRect(av->viewport->rect(), topLeft, bottomRight);
+ }
+ mutable QRect m_intersectecRect;
bool wasPainted = false;
public slots:
void handleSelectionChanged()
@@ -208,6 +215,8 @@ private slots:
void statusTip_data();
void statusTip();
void fetchMoreOnScroll();
+ void checkIntersectedRect_data();
+ void checkIntersectedRect();
// task-specific tests:
void task174627_moveLeftToRoot();
@@ -4842,6 +4851,111 @@ void tst_QTreeView::fetchMoreOnScroll()
QCOMPARE(im.item(19)->rowCount(), 20);
}
+void tst_QTreeView::checkIntersectedRect_data()
+{
+ auto createModel = [](int rowCount)
+ {
+ QStandardItemModel *model = new QStandardItemModel;
+ for (int i = 0; i < rowCount; ++i) {
+ const QList<QStandardItem *> sil({new QStandardItem(QLatin1String("Row %1 Item").arg(i)),
+ new QStandardItem(QLatin1String("2nd column"))});
+ model->appendRow(sil);
+ }
+ for (int i = 2; i < 4; ++i) {
+ const QList<QStandardItem *> sil({new QStandardItem(QLatin1String("Row %1 Item").arg(i)),
+ new QStandardItem(QLatin1String("2nd column"))});
+ model->item(i)->appendRow(sil);
+ }
+ return model;
+ };
+ QTest::addColumn<QStandardItemModel *>("model");
+ QTest::addColumn<QVector<QModelIndex>>("changedIndexes");
+ QTest::addColumn<bool>("isEmpty");
+ {
+ auto model = createModel(5);
+ QTest::newRow("multiple columns") << model
+ << QVector<QModelIndex>({model->index(0, 0),
+ model->index(0, 1)})
+ << false;
+ }
+ {
+ auto model = createModel(5);
+ QTest::newRow("multiple rows") << model
+ << QVector<QModelIndex>({model->index(0, 0),
+ model->index(1, 0),
+ model->index(2, 0)})
+ << false;
+ }
+ {
+ auto model = createModel(5);
+ const QModelIndex idxRow2(model->indexFromItem(model->item(2)));
+ QTest::newRow("child row") << model
+ << QVector<QModelIndex>({model->index(0, 0, idxRow2),
+ model->index(0, 1, idxRow2)})
+ << false;
+ }
+ {
+ auto model = createModel(5);
+ QTest::newRow("hidden row") << model
+ << QVector<QModelIndex>({model->index(3, 0),
+ model->index(3, 1)})
+ << true;
+ }
+ {
+ auto model = createModel(5);
+ const QModelIndex idxRow3(model->indexFromItem(model->item(3)));
+ QTest::newRow("hidden child row") << model
+ << QVector<QModelIndex>({model->index(0, 0, idxRow3),
+ model->index(0, 1, idxRow3)})
+ << true;
+ }
+ {
+ auto model = createModel(50);
+ QTest::newRow("row outside viewport") << model
+ << QVector<QModelIndex>({model->index(49, 0),
+ model->index(49, 1)})
+ << true;
+ }
+}
+
+void tst_QTreeView::checkIntersectedRect()
+{
+ QFETCH(QStandardItemModel *, model);
+ QFETCH(const QVector<QModelIndex>, changedIndexes);
+ QFETCH(bool, isEmpty);
+
+ TreeView view;
+ model->setParent(&view);
+ view.setModel(model);
+ view.resize(400, 400);
+ view.show();
+ view.expandAll();
+ view.setRowHidden(3, QModelIndex(), true);
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
+
+ view.m_intersectecRect = QRect();
+ emit view.model()->dataChanged(changedIndexes.first(), changedIndexes.last());
+ if (isEmpty) {
+ QVERIFY(view.m_intersectecRect.isEmpty());
+ } else if (!changedIndexes.first().isValid()) {
+ QCOMPARE(view.m_intersectecRect, view.viewport()->rect());
+ } else {
+ const auto parent = changedIndexes.first().parent();
+ const int rCount = view.model()->rowCount(parent);
+ const int cCount = view.model()->columnCount(parent);
+ for (int r = 0; r < rCount; ++r) {
+ for (int c = 0; c < cCount; ++c) {
+ const QModelIndex &idx = view.model()->index(r, c, parent);
+ const auto rect = view.visualRect(idx);
+ if (changedIndexes.contains(idx))
+ QVERIFY(view.m_intersectecRect.contains(rect));
+ else
+ QVERIFY(!view.m_intersectecRect.contains(rect));
+ }
+ }
+ }
+}
+
static void fillModeltaskQTBUG_8376(QAbstractItemModel &model)
{
model.insertRow(0);
diff --git a/tests/auto/widgets/itemviews/qtreewidget/CMakeLists.txt b/tests/auto/widgets/itemviews/qtreewidget/CMakeLists.txt
new file mode 100644
index 0000000000..dde2e9d4ab
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qtreewidget/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from qtreewidget.pro.
+
+#####################################################################
+## tst_qtreewidget Test:
+#####################################################################
+
+add_qt_test(tst_qtreewidget
+ SOURCES
+ tst_qtreewidget.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)
diff --git a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/CMakeLists.txt b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/CMakeLists.txt
new file mode 100644
index 0000000000..65ac8cda8b
--- /dev/null
+++ b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Generated from qtreewidgetitemiterator.pro.
+
+#####################################################################
+## tst_qtreewidgetitemiterator Test:
+#####################################################################
+
+add_qt_test(tst_qtreewidgetitemiterator
+ SOURCES
+ tst_qtreewidgetitemiterator.cpp
+ PUBLIC_LIBRARIES
+ Qt::Gui
+ Qt::Widgets
+)