From 4910f416c2c0d1ec4a11408647bc6c96c719ce18 Mon Sep 17 00:00:00 2001 From: David Faure Date: Thu, 15 Jan 2015 14:12:34 +0100 Subject: Itemviews: add ItemIsUserTristate flag ItemIsTristate is now again purely for enabling the automatic management of the check state of QTreeWidgetItems, while ItemIsUserTristate is separate from that and lets the user select the three states manually. This restores the original behavior of ItemIsTristate for QTreeWidgetItems, which got broken by letting the user cycle through the states too. [ChangeLog][QtWidgets][QTreeWidget] Restored Qt 5.1 behavior of QTreeWidgetItems with ItemIsTristate to enable automatic management of the check state. User-editable tristate checkboxes are now enabled by setting the new flag ItemIsUserTristate. Task-number: QTBUG-40060 Change-Id: I341f5e983804d3b4f27982520bb6647f3014cccc Reviewed-by: Oswald Buddenhagen Reviewed-by: Jarek Kobus --- .../itemviews/qtreewidget/tst_qtreewidget.cpp | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'tests/auto/widgets/itemviews/qtreewidget') diff --git a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp index c1331d62e1..23b6c3e369 100644 --- a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp +++ b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp @@ -129,6 +129,8 @@ private slots: void task245280_sortChildren(); void task253109_itemHeight(); + void nonEditableTristate(); + // QTreeWidgetItem void itemOperatorLessThan(); void addChild(); @@ -3162,6 +3164,40 @@ void tst_QTreeWidget::task217309() QVERIFY(item.data(0, Qt::CheckStateRole) == Qt::Checked); } +void tst_QTreeWidget::nonEditableTristate() +{ + // A tree with checkable items, the parent is tristate + QTreeWidget *tree = new QTreeWidget; + QTreeWidgetItem *item = new QTreeWidgetItem(); + tree->insertTopLevelItem(0, item); + item->setFlags(item->flags() | Qt::ItemIsTristate); + item->setCheckState(0, Qt::Unchecked); + QTreeWidgetItem *subitem1 = new QTreeWidgetItem(item); + subitem1->setCheckState(0, Qt::Unchecked); + QTreeWidgetItem *subitem2 = new QTreeWidgetItem(item); + subitem2->setCheckState(0, Qt::Unchecked); + QCOMPARE(int(item->checkState(0)), int(Qt::Unchecked)); + tree->show(); + + // Test clicking on the parent item, it should become Checked (not PartiallyChecked) + QStyleOptionViewItem option; + option.rect = tree->visualRect(tree->model()->index(0, 0)); + option.state |= QStyle::State_Enabled; + option.features |= QStyleOptionViewItem::HasCheckIndicator | QStyleOptionViewItem::HasDisplay; + option.checkState = item->checkState(0); + + const int checkMargin = qApp->style()->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, 0) + 1; + QPoint pos = qApp->style()->subElementRect(QStyle::SE_ViewItemCheckIndicator, &option, 0).center() + QPoint(checkMargin, 0); + QTest::mouseClick(tree->viewport(), Qt::LeftButton, Qt::NoModifier, pos); + QCOMPARE(int(item->checkState(0)), int(Qt::Checked)); + + // Click again, it should become Unchecked. + QTest::mouseClick(tree->viewport(), Qt::LeftButton, Qt::NoModifier, pos); + QCOMPARE(int(item->checkState(0)), int(Qt::Unchecked)); + + delete tree; +} + class TreeWidgetItem : public QTreeWidgetItem { -- cgit v1.2.3