summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp')
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp281
1 files changed, 223 insertions, 58 deletions
diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
index 345d048093..34972bc3e8 100644
--- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
+++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
@@ -1,34 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QHeaderView>
#include <QLineEdit>
#include <QMimeData>
+#include <QScrollBar>
#include <QSignalSpy>
#include <QTableWidget>
#include <QTest>
@@ -49,6 +25,7 @@ private slots:
void initTestCase();
void init();
void getSetCheck();
+ void selectionRange();
void clear();
void clearContents();
void rowCount();
@@ -60,6 +37,8 @@ private slots:
void takeItem();
void selectedItems_data();
void selectedItems();
+ void selectedSpannedCells_data();
+ void selectedSpannedCells();
void removeRow_data();
void removeRow();
void removeColumn_data();
@@ -85,12 +64,15 @@ private slots:
void task219380_removeLastRow();
void task262056_sortDuplicate();
void itemWithHeaderItems();
+ void checkHeaderItemFlagsConflict();
void mimeData();
void selectedRowAfterSorting();
void search();
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
void clearItemData();
#endif
+ void createPersistentOnLayoutAboutToBeChanged();
+ void createPersistentOnLayoutAboutToBeChangedAutoSort();
private:
std::unique_ptr<QTableWidget> testWidget;
@@ -153,6 +135,19 @@ void tst_QTableWidget::getSetCheck()
QCOMPARE(obj1.itemPrototype(), nullptr);
}
+void tst_QTableWidget::selectionRange()
+{
+ QTableWidgetSelectionRange defaultSelection;
+ QTableWidgetSelectionRange selection(1, 2, 3, 4);
+
+ QTableWidgetSelectionRange copy(selection);
+ QCOMPARE(copy, selection);
+ QVERIFY(copy != defaultSelection);
+
+ defaultSelection = copy;
+ QCOMPARE(defaultSelection, copy);
+}
+
void tst_QTableWidget::initTestCase()
{
testWidget.reset(new QTableWidget);
@@ -199,8 +194,8 @@ void tst_QTableWidget::clear()
QVERIFY(bla.isNull());
QVERIFY(!testWidget->item(0,0));
- QVERIFY(!testWidget->selectedRanges().count());
- QVERIFY(!testWidget->selectedItems().count());
+ QVERIFY(!testWidget->selectedRanges().size());
+ QVERIFY(!testWidget->selectedItems().size());
}
void tst_QTableWidget::rowCount()
@@ -367,7 +362,7 @@ void tst_QTableWidget::takeItem()
QCOMPARE(item->text(), QString::number(row * column + column));
delete item;
- QTRY_COMPARE(spy.count(), 1);
+ QTRY_COMPARE(spy.size(), 1);
const QList<QVariant> arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 2);
QCOMPARE(arguments.at(0).toInt(), row);
@@ -532,24 +527,24 @@ void tst_QTableWidget::selectedItems()
testWidget->setColumnHidden(column, true);
// make sure we don't have any previous selections hanging around
- QVERIFY(!testWidget->selectedRanges().count());
- QVERIFY(!testWidget->selectedItems().count());
+ QVERIFY(!testWidget->selectedRanges().size());
+ QVERIFY(!testWidget->selectedItems().size());
// select range and check that it is set correctly
testWidget->setRangeSelected(selectionRange, true);
if (selectionRange.topRow() >= 0) {
- QCOMPARE(testWidget->selectedRanges().count(), 1);
+ QCOMPARE(testWidget->selectedRanges().size(), 1);
QCOMPARE(testWidget->selectedRanges().at(0).topRow(), selectionRange.topRow());
QCOMPARE(testWidget->selectedRanges().at(0).bottomRow(), selectionRange.bottomRow());
QCOMPARE(testWidget->selectedRanges().at(0).leftColumn(), selectionRange.leftColumn());
QCOMPARE(testWidget->selectedRanges().at(0).rightColumn(), selectionRange.rightColumn());
} else {
- QCOMPARE(testWidget->selectedRanges().count(), 0);
+ QCOMPARE(testWidget->selectedRanges().size(), 0);
}
// check that the correct number of items and the expected items are there
const QList<QTableWidgetItem *> selectedItems = testWidget->selectedItems();
- QCOMPARE(selectedItems.count(), expectedItems.count());
+ QCOMPARE(selectedItems.size(), expectedItems.size());
for (const auto &intPair : expectedItems)
QVERIFY(selectedItems.contains(testWidget->item(intPair.first, intPair.second)));
@@ -569,6 +564,75 @@ void tst_QTableWidget::selectedItems()
}
}
+void tst_QTableWidget::selectedSpannedCells_data()
+{
+ QTest::addColumn<QRect>("spannedCells"); // in cells, not pixels
+ QTest::addColumn<QPoint>("selectionStartCell");
+ QTest::addColumn<QPoint>("selectionEndCell");
+ QTest::addColumn<int>("expectedSelectionRangeCount");
+ QTest::addColumn<QTableWidgetSelectionRange>("expectedFirstSelectionRange");
+
+ QTest::newRow("merge 2 cells in column, select adjacent left")
+ << QRect(1, 2, 1, 2) << QPoint(0, 1) << QPoint(0, 3)
+ << 1 << QTableWidgetSelectionRange(1, 0, 3, 0);
+
+ QTest::newRow("merge 2 cells in column, select those and one more")
+ << QRect(1, 2, 1, 2) << QPoint(1, 1) << QPoint(1, 3)
+ << 3 << QTableWidgetSelectionRange(1, 1, 1, 1);
+
+ QTest::newRow("merge 2 cells in column, select rows above")
+ << QRect(1, 2, 1, 2) << QPoint(0, 0) << QPoint(3, 1)
+ << 1 << QTableWidgetSelectionRange(0, 0, 1, 3);
+
+ QTest::newRow("merge 4 cells in column, select adjacent right")
+ << QRect(1, 0, 1, 4) << QPoint(2, 0) << QPoint(3, 3)
+ << 1 << QTableWidgetSelectionRange(0, 2, 3, 3);
+
+ QTest::newRow("merge 3 cells in row, select those and one more")
+ << QRect(0, 1, 3, 1) << QPoint(0, 1) << QPoint(3, 1)
+ << 4 << QTableWidgetSelectionRange(1, 0, 1, 0);
+
+ QTest::newRow("merge 3 cells in row, select adjacent to right")
+ << QRect(0, 1, 3, 1) << QPoint(3, 0) << QPoint(3, 2)
+ << 1 << QTableWidgetSelectionRange(0, 3, 2, 3);
+
+ QTest::newRow("merge 3 cells in row, select adjacent above")
+ << QRect(0, 2, 3, 2) << QPoint(0, 1) << QPoint(2, 1)
+ << 1 << QTableWidgetSelectionRange(1, 0, 1, 2);
+}
+
+void tst_QTableWidget::selectedSpannedCells() // QTBUG-255
+{
+ QFETCH(QRect, spannedCells);
+ QFETCH(QPoint, selectionStartCell);
+ QFETCH(QPoint, selectionEndCell);
+ QFETCH(int, expectedSelectionRangeCount);
+ QFETCH(const QTableWidgetSelectionRange, expectedFirstSelectionRange);
+
+ QTableWidget testWidget(4, 4);
+ testWidget.resize(600, 200);
+ testWidget.show();
+
+ // create and set items
+ for (int c = 0; c < 4; ++c) {
+ for (int r = 0; r < 4; ++r)
+ testWidget.setItem(r, c, new QTableWidgetItem(QString("Item %1 %2").arg(c).arg(r)));
+ }
+
+ // merge some cells
+ testWidget.setSpan(spannedCells.top(), spannedCells.left(), spannedCells.height(), spannedCells.width());
+
+ // click one cell and shift-click another, to select a range
+ QTest::mouseClick(testWidget.viewport(), Qt::LeftButton, Qt::NoModifier,
+ testWidget.visualRect(testWidget.model()->index(selectionStartCell.y(), selectionStartCell.x())).center());
+ QTest::mouseClick(testWidget.viewport(), Qt::LeftButton, Qt::ShiftModifier,
+ testWidget.visualRect(testWidget.model()->index(selectionEndCell.y(), selectionEndCell.x())).center());
+
+ auto ranges = testWidget.selectedRanges();
+ QCOMPARE(ranges.size(), expectedSelectionRangeCount);
+ QCOMPARE(ranges.first(), expectedFirstSelectionRange);
+}
+
void tst_QTableWidget::removeRow_data()
{
QTest::addColumn<int>("rowCount");
@@ -1132,15 +1196,15 @@ void tst_QTableWidget::sortItems()
persistent << model->index(r, sortColumn, QModelIndex());
}
- for (int h = 0; h < initialHidden.count(); ++h)
+ for (int h = 0; h < initialHidden.size(); ++h)
testWidget->hideRow(initialHidden.at(h));
- QCOMPARE(testWidget->verticalHeader()->hiddenSectionCount(), initialHidden.count());
+ QCOMPARE(testWidget->verticalHeader()->hiddenSectionCount(), initialHidden.size());
testWidget->sortItems(sortColumn, sortOrder);
int te = 0;
- for (int i = 0; i < rows.count(); ++i) {
+ for (int i = 0; i < rows.size(); ++i) {
for (int j = 0; j < columnCount; ++j) {
QString value;
QTableWidgetItem *itm = testWidget->item(i, j);
@@ -1154,7 +1218,7 @@ void tst_QTableWidget::sortItems()
// << "expected" << rows.at(i);
}
- for (int k = 0; k < expectedHidden.count(); ++k)
+ for (int k = 0; k < expectedHidden.size(); ++k)
QVERIFY(testWidget->isRowHidden(expectedHidden.at(k)));
}
@@ -1335,18 +1399,18 @@ void tst_QTableWidget::setItemWithSorting()
}
}
- for (int k = 0; k < persistent.count(); ++k) {
+ for (int k = 0; k < persistent.size(); ++k) {
QCOMPARE(persistent.at(k).row(), expectedRows.at(k));
int i = (persistent.at(k).row() * columnCount) + sortColumn;
QCOMPARE(persistent.at(k).data().toString(), expectedValues.at(i));
}
if (i == 0)
- QCOMPARE(dataChangedSpy.count(), reorderingExpected ? 0 : 1);
+ QCOMPARE(dataChangedSpy.size(), reorderingExpected ? 0 : 1);
else
- QCOMPARE(dataChangedSpy.count(), 1);
+ QCOMPARE(dataChangedSpy.size(), 1);
- QCOMPARE(layoutChangedSpy.count(), reorderingExpected ? 1 : 0);
+ QCOMPARE(layoutChangedSpy.size(), reorderingExpected ? 1 : 0);
}
}
@@ -1382,7 +1446,7 @@ void tst_QTableWidget::itemData()
QCOMPARE(widget.currentRoles, QList<int> { Qt::UserRole + i });
}
QMap<int, QVariant> flags = widget.model()->itemData(widget.model()->index(0, 0));
- QCOMPARE(flags.count(), 6);
+ QCOMPARE(flags.size(), 6);
for (int i = 0; i < 4; ++i)
QCOMPARE(flags[Qt::UserRole + i].toString(), QString::number(i + 1));
}
@@ -1395,7 +1459,7 @@ void tst_QTableWidget::setItemData()
QTableWidgetItem *item = new QTableWidgetItem;
table.setItem(0, 0, item);
- QCOMPARE(dataChangedSpy.count(), 1);
+ QCOMPARE(dataChangedSpy.size(), 1);
QModelIndex idx = qvariant_cast<QModelIndex>(dataChangedSpy.takeFirst().at(0));
QMap<int, QVariant> data;
@@ -1407,7 +1471,7 @@ void tst_QTableWidget::setItemData()
QCOMPARE(table.model()->data(idx, Qt::DisplayRole).toString(), QLatin1String("Display"));
QCOMPARE(table.model()->data(idx, Qt::EditRole).toString(), QLatin1String("Display"));
QCOMPARE(table.model()->data(idx, Qt::ToolTipRole).toString(), QLatin1String("ToolTip"));
- QCOMPARE(dataChangedSpy.count(), 1);
+ QCOMPARE(dataChangedSpy.size(), 1);
QCOMPARE(idx, qvariant_cast<QModelIndex>(dataChangedSpy.first().at(0)));
QCOMPARE(idx, qvariant_cast<QModelIndex>(dataChangedSpy.first().at(1)));
const auto roles = qvariant_cast<QList<int>>(dataChangedSpy.first().at(2));
@@ -1418,13 +1482,13 @@ void tst_QTableWidget::setItemData()
dataChangedSpy.clear();
table.model()->setItemData(idx, data);
- QCOMPARE(dataChangedSpy.count(), 0);
+ QCOMPARE(dataChangedSpy.size(), 0);
data.clear();
data.insert(Qt::DisplayRole, QLatin1String("dizplaye"));
table.model()->setItemData(idx, data);
QCOMPARE(table.model()->data(idx, Qt::DisplayRole).toString(), QLatin1String("dizplaye"));
- QCOMPARE(dataChangedSpy.count(), 1);
+ QCOMPARE(dataChangedSpy.size(), 1);
QCOMPARE(QList<int>({ Qt::DisplayRole, Qt::EditRole }),
qvariant_cast<QList<int>>(dataChangedSpy.first().at(2)));
@@ -1493,6 +1557,12 @@ void tst_QTableWidget::sizeHint()
QFETCH(Qt::ScrollBarPolicy, scrollBarPolicy);
QFETCH(QSize, viewSize);
+ const QString defaultStyle = QApplication::style()->name();
+ QApplication::setStyle("windows");
+ const auto resetStyle = qScopeGuard([defaultStyle]{
+ QApplication::setStyle(defaultStyle);
+ });
+
QTableWidget view(2, 2);
view.setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
view.setVerticalScrollBarPolicy(scrollBarPolicy);
@@ -1512,18 +1582,21 @@ void tst_QTableWidget::sizeHint()
QTRY_COMPARE(view.size(), viewSize);
}
+ QApplication::processEvents(); // execute delayed layouts
auto sizeHint = view.sizeHint();
view.hide();
QCOMPARE(view.sizeHint(), sizeHint);
view.horizontalHeader()->hide();
view.show();
+ QApplication::processEvents(); // execute delayed layouts
sizeHint = view.sizeHint();
view.hide();
QCOMPARE(view.sizeHint(), sizeHint);
view.verticalHeader()->hide();
view.show();
+ QApplication::processEvents(); // execute delayed layouts
sizeHint = view.sizeHint();
view.hide();
QCOMPARE(view.sizeHint(), sizeHint);
@@ -1587,7 +1660,7 @@ void tst_QTableWidget::task262056_sortDuplicate()
QSignalSpy layoutChangedSpy(testWidget->model(), &QAbstractItemModel::layoutChanged);
testWidget->item(3,0)->setBackground(Qt::red);
- QCOMPARE(layoutChangedSpy.count(),0);
+ QCOMPARE(layoutChangedSpy.size(),0);
}
@@ -1607,6 +1680,25 @@ void tst_QTableWidget::itemWithHeaderItems()
QCOMPARE(table.item(0, 1), nullptr);
}
+void tst_QTableWidget::checkHeaderItemFlagsConflict()
+{
+ // QTBUG-113209
+ // Check that setting header item doesn't set Qt::ItemNeverHasChildren
+ // Chech that header items do not emit itemChanged.
+ QTableWidget table(1, 1);
+ QSignalSpy itemChangeSpy(&table, &QTableWidget::itemChanged);
+ QVERIFY(itemChangeSpy.isValid());
+
+ QTableWidgetItem *item = new QTableWidgetItem("Initial");
+ table.setHorizontalHeaderItem(0, item);
+
+ QVERIFY(!(item->flags() & Qt::ItemNeverHasChildren));
+
+ item->setData(Qt::DisplayRole, "updated");
+
+ QCOMPARE(itemChangeSpy.size(), 0);
+}
+
class TestTableWidget : public QTableWidget
{
Q_OBJECT
@@ -1684,7 +1776,7 @@ void tst_QTableWidget::selectedRowAfterSorting()
table.setProperty("sortingEnabled",true);
table.selectRow(1);
table.item(1,1)->setText("9");
- QCOMPARE(table.selectedItems().count(),3);
+ QCOMPARE(table.selectedItems().size(),3);
const auto selectedItems = table.selectedItems();
for (QTableWidgetItem *item : selectedItems)
QCOMPARE(item->row(), 0);
@@ -1699,9 +1791,13 @@ void tst_QTableWidget::search()
return item;
};
- auto checkSeries = [](TestTableWidget &tw, const QList<QPair<QKeyEvent, int>> &series) {
+ struct KeyPress {
+ Qt::Key key;
+ QString text;
+ };
+ auto checkSeries = [](TestTableWidget &tw, const QList<QPair<KeyPress, int>> &series) {
for (const auto &p : series) {
- QKeyEvent e = p.first;
+ QKeyEvent e(QEvent::KeyPress, p.first.key, Qt::NoModifier, p.first.text);
tw.keyPressEvent(&e);
QVERIFY(tw.selectionModel()->isSelected(tw.model()->index(p.second, 0)));
}
@@ -1714,12 +1810,12 @@ void tst_QTableWidget::search()
tw.setItem(4, 0, createItem(" "));
tw.show();
- QKeyEvent evSpace(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier, " ");
- QKeyEvent ev1(QEvent::KeyPress, Qt::Key_1, Qt::NoModifier, "1");
- QKeyEvent ev2(QEvent::KeyPress, Qt::Key_2, Qt::NoModifier, "2");
- QKeyEvent ev3(QEvent::KeyPress, Qt::Key_3, Qt::NoModifier, "3");
- QKeyEvent ev4(QEvent::KeyPress, Qt::Key_4, Qt::NoModifier, "4");
- QKeyEvent ev5(QEvent::KeyPress, Qt::Key_5, Qt::NoModifier, "5");
+ KeyPress evSpace{Qt::Key_Space, " "};
+ KeyPress ev1{Qt::Key_1, "1"};
+ KeyPress ev2{Qt::Key_2, "2"};
+ KeyPress ev3{Qt::Key_3, "3"};
+ KeyPress ev4{Qt::Key_4, "4"};
+ KeyPress ev5{Qt::Key_5, "5"};
checkSeries(tw, {{evSpace, 4}, {ev1, 4}});
QTest::qWait(QApplication::keyboardInputInterval() * 2);
@@ -1752,5 +1848,74 @@ void tst_QTableWidget::clearItemData()
}
#endif
+void tst_QTableWidget::createPersistentOnLayoutAboutToBeChanged() // QTBUG-93466
+{
+ QTableWidget widget;
+ widget.model()->insertColumn(0);
+ QCOMPARE(widget.model()->columnCount(), 1);
+ widget.model()->insertRows(0, 3);
+ for (int row = 0; row < 3; ++row)
+ widget.model()->setData(widget.model()->index(row, 0), row);
+ QList<QPersistentModelIndex> idxList;
+ QSignalSpy layoutAboutToBeChangedSpy(widget.model(), &QAbstractItemModel::layoutAboutToBeChanged);
+ QSignalSpy layoutChangedSpy(widget.model(), &QAbstractItemModel::layoutChanged);
+ connect(widget.model(), &QAbstractItemModel::layoutAboutToBeChanged, this, [&idxList, &widget](){
+ idxList.clear();
+ for (int row = 0; row < 3; ++row)
+ idxList << QPersistentModelIndex(widget.model()->index(row, 0));
+ });
+ connect(widget.model(), &QAbstractItemModel::layoutChanged, this, [&idxList](){
+ QCOMPARE(idxList.size(), 3);
+ QCOMPARE(idxList.at(0).row(), 1);
+ QCOMPARE(idxList.at(0).column(), 0);
+ QCOMPARE(idxList.at(0).data().toInt(), 0);
+ QCOMPARE(idxList.at(1).row(), 0);
+ QCOMPARE(idxList.at(1).column(), 0);
+ QCOMPARE(idxList.at(1).data().toInt(), -1);
+ QCOMPARE(idxList.at(2).row(), 2);
+ QCOMPARE(idxList.at(2).column(), 0);
+ QCOMPARE(idxList.at(2).data().toInt(), 2);
+ });
+ widget.model()->setData(widget.model()->index(1, 0), -1);
+ widget.model()->sort(0);
+ QCOMPARE(layoutAboutToBeChangedSpy.size(), 1);
+ QCOMPARE(layoutChangedSpy.size(), 1);
+}
+
+void tst_QTableWidget::createPersistentOnLayoutAboutToBeChangedAutoSort() // QTBUG-93466
+{
+ QTableWidget widget;
+ widget.model()->insertColumn(0);
+ QCOMPARE(widget.model()->columnCount(), 1);
+ widget.model()->insertRows(0, 3);
+ for (int row = 0; row < 3; ++row)
+ widget.model()->setData(widget.model()->index(row, 0), row);
+ widget.sortByColumn(0, Qt::AscendingOrder);
+ widget.setSortingEnabled(true);
+ QList<QPersistentModelIndex> idxList;
+ QSignalSpy layoutAboutToBeChangedSpy(widget.model(), &QAbstractItemModel::layoutAboutToBeChanged);
+ QSignalSpy layoutChangedSpy(widget.model(), &QAbstractItemModel::layoutChanged);
+ connect(widget.model(), &QAbstractItemModel::layoutAboutToBeChanged, this, [&idxList, &widget](){
+ idxList.clear();
+ for (int row = 0; row < 3; ++row)
+ idxList << QPersistentModelIndex(widget.model()->index(row, 0));
+ });
+ connect(widget.model(), &QAbstractItemModel::layoutChanged, this, [&idxList](){
+ QCOMPARE(idxList.size(), 3);
+ QCOMPARE(idxList.at(0).row(), 1);
+ QCOMPARE(idxList.at(0).column(), 0);
+ QCOMPARE(idxList.at(0).data().toInt(), 0);
+ QCOMPARE(idxList.at(1).row(), 0);
+ QCOMPARE(idxList.at(1).column(), 0);
+ QCOMPARE(idxList.at(1).data().toInt(), -1);
+ QCOMPARE(idxList.at(2).row(), 2);
+ QCOMPARE(idxList.at(2).column(), 0);
+ QCOMPARE(idxList.at(2).data().toInt(), 2);
+ });
+ widget.model()->setData(widget.model()->index(1, 0), -1);
+ QCOMPARE(layoutAboutToBeChangedSpy.size(), 1);
+ QCOMPARE(layoutChangedSpy.size(), 1);
+}
+
QTEST_MAIN(tst_QTableWidget)
#include "tst_qtablewidget.moc"