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/qlistview/tst_qlistview.cpp62
-rw-r--r--tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp8
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp8
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp78
4 files changed, 148 insertions, 8 deletions
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
index 22245707cc..9b8b306e00 100644
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
@@ -48,6 +48,7 @@
#include <QtWidgets/QScrollBar>
#include <QtWidgets/QDialog>
#include <QtWidgets/QStyledItemDelegate>
+#include <QtWidgets/QStyleFactory>
#if defined(Q_OS_WIN) || defined(Q_OS_WINCE)
# include <windows.h>
@@ -2350,11 +2351,34 @@ void tst_QListView::testViewOptions()
QCOMPARE(options.decorationPosition, QStyleOptionViewItem::Top);
}
+// make sure we have no transient scroll bars
+class TempStyleSetter
+{
+public:
+ TempStyleSetter()
+ : m_oldStyle(qApp->style())
+ {
+ m_oldStyle->setParent(0);
+ QListView tempView;
+ if (QApplication::style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, tempView.horizontalScrollBar()))
+ QApplication::setStyle(QStyleFactory::create("Fusion"));
+ }
+
+ ~TempStyleSetter()
+ {
+ QApplication::setStyle(m_oldStyle);
+ }
+private:
+ QStyle* m_oldStyle;
+};
+
void tst_QListView::taskQTBUG_39902_mutualScrollBars()
{
QWidget window;
window.resize(400, 300);
QListView *view = new QListView(&window);
+ // make sure we have no transient scroll bars
+ TempStyleSetter styleSetter;
QStandardItemModel model(200, 1);
const QSize itemSize(100, 20);
for (int i = 0; i < model.rowCount(); ++i)
@@ -2372,6 +2396,44 @@ void tst_QListView::taskQTBUG_39902_mutualScrollBars()
view->resize(itemSize.width() + view->frameWidth() * 2, model.rowCount() * itemSize.height() + view->frameWidth() * 2);
// this will end up in a stack overflow, if QTBUG-39902 is not fixed
QTest::qWait(100);
+
+ // these tests do not apply with transient scroll bars enabled
+ QVERIFY (!view->style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, view->horizontalScrollBar()));
+
+ // make it double as large, no scroll bars should be visible
+ view->resize((itemSize.width() + view->frameWidth() * 2) * 2, (model.rowCount() * itemSize.height() + view->frameWidth() * 2) * 2);
+ QTRY_VERIFY(!view->horizontalScrollBar()->isVisible());
+ QTRY_VERIFY(!view->verticalScrollBar()->isVisible());
+
+ // make it half the size, both scroll bars should be visible
+ view->resize((itemSize.width() + view->frameWidth() * 2) / 2, (model.rowCount() * itemSize.height() + view->frameWidth() * 2) / 2);
+ QTRY_VERIFY(view->horizontalScrollBar()->isVisible());
+ QTRY_VERIFY(view->verticalScrollBar()->isVisible());
+
+ // make it double as large, no scroll bars should be visible
+ view->resize((itemSize.width() + view->frameWidth() * 2) * 2, (model.rowCount() * itemSize.height() + view->frameWidth() * 2) * 2);
+ QTRY_VERIFY(!view->horizontalScrollBar()->isVisible());
+ QTRY_VERIFY(!view->verticalScrollBar()->isVisible());
+
+ // now, coming from the double size, resize it to the exactly matching size, still no scroll bars should be visible again
+ view->resize(itemSize.width() + view->frameWidth() * 2, model.rowCount() * itemSize.height() + view->frameWidth() * 2);
+ QTRY_VERIFY(!view->horizontalScrollBar()->isVisible());
+ QTRY_VERIFY(!view->verticalScrollBar()->isVisible());
+
+ // now remove just one single pixel in height -> both scroll bars will show up since they depend on each other
+ view->resize(itemSize.width() + view->frameWidth() * 2, model.rowCount() * itemSize.height() + view->frameWidth() * 2 - 1);
+ QTRY_VERIFY(view->horizontalScrollBar()->isVisible());
+ QTRY_VERIFY(view->verticalScrollBar()->isVisible());
+
+ // now remove just one single pixel in with -> both scroll bars will show up since they depend on each other
+ view->resize(itemSize.width() + view->frameWidth() * 2 - 1, model.rowCount() * itemSize.height() + view->frameWidth() * 2);
+ QTRY_VERIFY(view->horizontalScrollBar()->isVisible());
+ QTRY_VERIFY(view->verticalScrollBar()->isVisible());
+
+ // finally, coming from a size being to small, resize back to the exactly matching size -> both scroll bars should disappear again
+ view->resize(itemSize.width() + view->frameWidth() * 2, model.rowCount() * itemSize.height() + view->frameWidth() * 2);
+ QTRY_VERIFY(!view->horizontalScrollBar()->isVisible());
+ QTRY_VERIFY(!view->verticalScrollBar()->isVisible());
}
void tst_QListView::horizontalScrollingByVerticalWheelEvents()
diff --git a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
index 6786ae9aa2..dcbdbe824a 100644
--- a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
+++ b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
@@ -605,21 +605,21 @@ void tst_QListWidget::insertItems()
void tst_QListWidget::itemAssignment()
{
QListWidgetItem itemInWidget("inWidget", testWidget);
- itemInWidget.setFlags(itemInWidget.flags() | Qt::ItemIsTristate);
+ itemInWidget.setFlags(itemInWidget.flags() | Qt::ItemIsUserTristate);
QListWidgetItem itemOutsideWidget("outsideWidget");
QVERIFY(itemInWidget.listWidget());
QCOMPARE(itemInWidget.text(), QString("inWidget"));
- QVERIFY(itemInWidget.flags() & Qt::ItemIsTristate);
+ QVERIFY(itemInWidget.flags() & Qt::ItemIsUserTristate);
QVERIFY(!itemOutsideWidget.listWidget());
QCOMPARE(itemOutsideWidget.text(), QString("outsideWidget"));
- QVERIFY(!(itemOutsideWidget.flags() & Qt::ItemIsTristate));
+ QVERIFY(!(itemOutsideWidget.flags() & Qt::ItemIsUserTristate));
itemOutsideWidget = itemInWidget;
QVERIFY(!itemOutsideWidget.listWidget());
QCOMPARE(itemOutsideWidget.text(), QString("inWidget"));
- QVERIFY(itemOutsideWidget.flags() & Qt::ItemIsTristate);
+ QVERIFY(itemOutsideWidget.flags() & Qt::ItemIsUserTristate);
}
void tst_QListWidget::item_data()
diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
index a4c6e13979..36bc23910c 100644
--- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
+++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
@@ -281,21 +281,21 @@ void tst_QTableWidget::itemAssignment()
{
QTableWidgetItem itemInWidget("inWidget");
testWidget->setItem(0, 0, &itemInWidget);
- itemInWidget.setFlags(itemInWidget.flags() | Qt::ItemIsTristate);
+ itemInWidget.setFlags(itemInWidget.flags() | Qt::ItemIsUserTristate);
QTableWidgetItem itemOutsideWidget("outsideWidget");
QVERIFY(itemInWidget.tableWidget());
QCOMPARE(itemInWidget.text(), QString("inWidget"));
- QVERIFY(itemInWidget.flags() & Qt::ItemIsTristate);
+ QVERIFY(itemInWidget.flags() & Qt::ItemIsUserTristate);
QVERIFY(!itemOutsideWidget.tableWidget());
QCOMPARE(itemOutsideWidget.text(), QString("outsideWidget"));
- QVERIFY(!(itemOutsideWidget.flags() & Qt::ItemIsTristate));
+ QVERIFY(!(itemOutsideWidget.flags() & Qt::ItemIsUserTristate));
itemOutsideWidget = itemInWidget;
QVERIFY(!itemOutsideWidget.tableWidget());
QCOMPARE(itemOutsideWidget.text(), QString("inWidget"));
- QVERIFY(itemOutsideWidget.flags() & Qt::ItemIsTristate);
+ QVERIFY(itemOutsideWidget.flags() & Qt::ItemIsUserTristate);
}
void tst_QTableWidget::item_data()
diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
index 3ead172d82..1324027af6 100644
--- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
@@ -255,6 +255,7 @@ private slots:
void taskQTBUG_8176_emitOnExpandAll();
void taskQTBUG_34717_collapseAtBottom();
void taskQTBUG_37813_crash();
+ void taskQTBUG_45697_crash();
void testInitialFocus();
};
@@ -4385,5 +4386,82 @@ void tst_QTreeView::taskQTBUG_37813_crash()
#endif // QT_BUILD_INTERNAL
}
+// QTBUG-45697: Using a QTreeView with a multi-column model filtered by QSortFilterProxyModel,
+// when sorting the source model while the widget is not yet visible and showing the widget
+// later on, corruption occurs in QTreeView.
+class Qtbug45697TestWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ static const int columnCount = 3;
+
+ explicit Qtbug45697TestWidget();
+ int timerTick() const { return m_timerTick; }
+
+public slots:
+ void slotTimer();
+
+private:
+ QTreeView *m_treeView;
+ QStandardItemModel *m_model;
+ QSortFilterProxyModel *m_sortFilterProxyModel;
+ int m_timerTick;
+};
+
+Qtbug45697TestWidget::Qtbug45697TestWidget()
+ : m_treeView(new QTreeView(this))
+ , m_model(new QStandardItemModel(0, Qtbug45697TestWidget::columnCount, this))
+ , m_sortFilterProxyModel(new QSortFilterProxyModel(this))
+ , m_timerTick(0)
+ {
+ QVBoxLayout *vBoxLayout = new QVBoxLayout(this);
+ vBoxLayout->addWidget(m_treeView);
+
+ for (char sortChar = 'z'; sortChar >= 'a' ; --sortChar) {
+ QList<QStandardItem *> items;
+ for (int column = 0; column < Qtbug45697TestWidget::columnCount; ++column) {
+ const QString text = QLatin1Char(sortChar) + QLatin1String(" ") + QString::number(column);
+ items.append(new QStandardItem(text));
+ }
+ m_model->appendRow(items);
+ }
+
+ m_sortFilterProxyModel->setSourceModel(m_model);
+ m_treeView->setModel(m_sortFilterProxyModel);
+
+ QHeaderView *headerView = m_treeView->header();
+ for (int s = 1, lastSection = headerView->count() - 1; s < lastSection; ++s )
+ headerView->setSectionResizeMode(s, QHeaderView::ResizeToContents);
+
+ QTimer *timer = new QTimer(this);
+ timer->setInterval(50);
+ connect(timer, &QTimer::timeout, this, &Qtbug45697TestWidget::slotTimer);
+ timer->start();
+}
+
+void Qtbug45697TestWidget::slotTimer()
+{
+ switch (m_timerTick++) {
+ case 0:
+ m_model->sort(0);
+ break;
+ case 1:
+ show();
+ break;
+ default:
+ close();
+ break;
+ }
+}
+
+void tst_QTreeView::taskQTBUG_45697_crash()
+{
+ Qtbug45697TestWidget testWidget;
+ testWidget.setWindowTitle(QTest::currentTestFunction());
+ testWidget.resize(400, 400);
+ testWidget.move(QGuiApplication::primaryScreen()->availableGeometry().topLeft() + QPoint(100, 100));
+ QTRY_VERIFY(testWidget.timerTick() >= 2);
+}
+
QTEST_MAIN(tst_QTreeView)
#include "tst_qtreeview.moc"