56 for (int i = 0; i < 2000 && expr != expected; i+=step) { \ |
57 for (int i = 0; i < 2000 && expr != expected; i+=step) { \ |
57 QTest::qWait(step); \ |
58 QTest::qWait(step); \ |
58 } \ |
59 } \ |
59 } while(0) |
60 } while(0) |
60 |
61 |
|
62 #ifdef QT_BUILD_INTERNAL |
|
63 #define VERIFY_SPANS_CONSISTENCY(TEST_VIEW_) \ |
|
64 QVERIFY(static_cast<QTableViewPrivate*>(QObjectPrivate::get(TEST_VIEW_))->spans.checkConsistency()) |
|
65 #else |
|
66 #define VERIFY_SPANS_CONSISTENCY(TEST_VIEW_) (void)false |
|
67 #endif |
|
68 |
61 typedef QList<int> IntList; |
69 typedef QList<int> IntList; |
62 Q_DECLARE_METATYPE(IntList) |
70 Q_DECLARE_METATYPE(IntList) |
63 |
71 |
64 typedef QList<bool> BoolList; |
72 typedef QList<bool> BoolList; |
65 Q_DECLARE_METATYPE(BoolList) |
73 Q_DECLARE_METATYPE(BoolList) |
186 void task227953_setRootIndex(); |
194 void task227953_setRootIndex(); |
187 void task240266_veryBigColumn(); |
195 void task240266_veryBigColumn(); |
188 void task248688_autoScrollNavigation(); |
196 void task248688_autoScrollNavigation(); |
189 void task259308_scrollVerticalHeaderSwappedSections(); |
197 void task259308_scrollVerticalHeaderSwappedSections(); |
190 void task191545_dragSelectRows(); |
198 void task191545_dragSelectRows(); |
|
199 void taskQTBUG_5062_spansInconsistency(); |
|
200 void taskQTBUG_4516_clickOnRichTextLabel(); |
|
201 void taskQTBUG_5237_wheelEventOnHeader(); |
191 |
202 |
192 void mouseWheel_data(); |
203 void mouseWheel_data(); |
193 void mouseWheel(); |
204 void mouseWheel(); |
194 |
205 |
195 void addColumnWhileEditing(); |
206 void addColumnWhileEditing(); |
196 void task234926_setHeaderSorting(); |
207 void task234926_setHeaderSorting(); |
|
208 |
|
209 void changeHeaderData(); |
197 }; |
210 }; |
198 |
211 |
199 // Testing get/set functions |
212 // Testing get/set functions |
200 void tst_QTableView::getSetCheck() |
213 void tst_QTableView::getSetCheck() |
201 { |
214 { |
2015 |
2028 |
2016 QSignalSpy resizedSpy(view.verticalHeader(), SIGNAL(sectionResized(int, int, int))); |
2029 QSignalSpy resizedSpy(view.verticalHeader(), SIGNAL(sectionResized(int, int, int))); |
2017 view.resizeRowsToContents(); |
2030 view.resizeRowsToContents(); |
2018 |
2031 |
2019 QCOMPARE(resizedSpy.count(), model.rowCount()); |
2032 QCOMPARE(resizedSpy.count(), model.rowCount()); |
2020 for (int r = 0; r < model.rowCount(); ++r) |
2033 for (int r = 0; r < model.rowCount(); ++r) { |
2021 QCOMPARE(view.rowHeight(r), rowHeight); |
2034 QCOMPARE(view.rowHeight(r), rowHeight); |
|
2035 } |
2022 } |
2036 } |
2023 |
2037 |
2024 void tst_QTableView::resizeColumnsToContents_data() |
2038 void tst_QTableView::resizeColumnsToContents_data() |
2025 { |
2039 { |
2026 QTest::addColumn<int>("rowCount"); |
2040 QTest::addColumn<int>("rowCount"); |
2998 << (SpanList() << QRect(0, 0, 2, 2) << QRect(2, 0, 1, 2)) |
3014 << (SpanList() << QRect(0, 0, 2, 2) << QRect(2, 0, 1, 2)) |
2999 << true //we hide the last row of the first span |
3015 << true //we hide the last row of the first span |
3000 << QPoint(2, 0) |
3016 << QPoint(2, 0) |
3001 << 1 |
3017 << 1 |
3002 << 2; |
3018 << 2; |
|
3019 |
|
3020 QTest::newRow("QTBUG-6004: No failing Q_ASSERT, then it passes.") |
|
3021 << 5 << 5 |
|
3022 << (SpanList() << QRect(0, 0, 2, 2) << QRect(0, 0, 1, 1)) |
|
3023 << false |
|
3024 << QPoint(0, 0) |
|
3025 << 1 |
|
3026 << 1; |
3003 } |
3027 } |
3004 |
3028 |
3005 void tst_QTableView::spans() |
3029 void tst_QTableView::spans() |
3006 { |
3030 { |
3007 QFETCH(int, rows); |
3031 QFETCH(int, rows); |
3031 QVERIFY(first.intersected(next).isEmpty()); |
3055 QVERIFY(first.intersected(next).isEmpty()); |
3032 } |
3056 } |
3033 |
3057 |
3034 QCOMPARE(view.columnSpan(pos.x(), pos.y()), expectedColumnSpan); |
3058 QCOMPARE(view.columnSpan(pos.x(), pos.y()), expectedColumnSpan); |
3035 QCOMPARE(view.rowSpan(pos.x(), pos.y()), expectedRowSpan); |
3059 QCOMPARE(view.rowSpan(pos.x(), pos.y()), expectedRowSpan); |
|
3060 |
|
3061 VERIFY_SPANS_CONSISTENCY(&view); |
3036 } |
3062 } |
3037 |
3063 |
3038 void tst_QTableView::spansAfterRowInsertion() |
3064 void tst_QTableView::spansAfterRowInsertion() |
3039 { |
3065 { |
3040 QtTestTableModel model(10, 10); |
3066 QtTestTableModel model(10, 10); |
3065 |
3091 |
3066 // Insertion after the span does nothing to it. |
3092 // Insertion after the span does nothing to it. |
3067 view.model()->insertRows(12, 2); |
3093 view.model()->insertRows(12, 2); |
3068 QCOMPARE(view.rowSpan(7, 3), 5); |
3094 QCOMPARE(view.rowSpan(7, 3), 5); |
3069 QCOMPARE(view.columnSpan(7, 3), 3); |
3095 QCOMPARE(view.columnSpan(7, 3), 3); |
|
3096 |
|
3097 VERIFY_SPANS_CONSISTENCY(&view); |
3070 } |
3098 } |
3071 |
3099 |
3072 void tst_QTableView::spansAfterColumnInsertion() |
3100 void tst_QTableView::spansAfterColumnInsertion() |
3073 { |
3101 { |
3074 QtTestTableModel model(10, 10); |
3102 QtTestTableModel model(10, 10); |
3099 |
3127 |
3100 // Insertion after the span does nothing to it. |
3128 // Insertion after the span does nothing to it. |
3101 view.model()->insertColumns(12, 2); |
3129 view.model()->insertColumns(12, 2); |
3102 QCOMPARE(view.rowSpan(3, 7), 3); |
3130 QCOMPARE(view.rowSpan(3, 7), 3); |
3103 QCOMPARE(view.columnSpan(3, 7), 5); |
3131 QCOMPARE(view.columnSpan(3, 7), 5); |
|
3132 |
|
3133 VERIFY_SPANS_CONSISTENCY(&view); |
3104 } |
3134 } |
3105 |
3135 |
3106 void tst_QTableView::spansAfterRowRemoval() |
3136 void tst_QTableView::spansAfterRowRemoval() |
3107 { |
3137 { |
3108 QtTestTableModel model(10, 10); |
3138 QtTestTableModel model(10, 10); |
3136 << QRect(6, 4, 1, 3); |
3166 << QRect(6, 4, 1, 3); |
3137 foreach (QRect span, expectedSpans) { |
3167 foreach (QRect span, expectedSpans) { |
3138 QCOMPARE(view.columnSpan(span.top(), span.left()), span.width()); |
3168 QCOMPARE(view.columnSpan(span.top(), span.left()), span.width()); |
3139 QCOMPARE(view.rowSpan(span.top(), span.left()), span.height()); |
3169 QCOMPARE(view.rowSpan(span.top(), span.left()), span.height()); |
3140 } |
3170 } |
|
3171 |
|
3172 VERIFY_SPANS_CONSISTENCY(&view); |
3141 } |
3173 } |
3142 |
3174 |
3143 void tst_QTableView::spansAfterColumnRemoval() |
3175 void tst_QTableView::spansAfterColumnRemoval() |
3144 { |
3176 { |
3145 QtTestTableModel model(10, 10); |
3177 QtTestTableModel model(10, 10); |
3174 << QRect(6, 4, 1, 3); |
3206 << QRect(6, 4, 1, 3); |
3175 foreach (QRect span, expectedSpans) { |
3207 foreach (QRect span, expectedSpans) { |
3176 QCOMPARE(view.columnSpan(span.left(), span.top()), span.height()); |
3208 QCOMPARE(view.columnSpan(span.left(), span.top()), span.height()); |
3177 QCOMPARE(view.rowSpan(span.left(), span.top()), span.width()); |
3209 QCOMPARE(view.rowSpan(span.left(), span.top()), span.width()); |
3178 } |
3210 } |
|
3211 |
|
3212 VERIFY_SPANS_CONSISTENCY(&view); |
3179 } |
3213 } |
3180 |
3214 |
3181 class Model : public QAbstractTableModel { |
3215 class Model : public QAbstractTableModel { |
3182 |
3216 |
3183 Q_OBJECT |
3217 Q_OBJECT |
3265 table3.resizeColumnsToContents(); |
3299 table3.resizeColumnsToContents(); |
3266 table3.resizeRowsToContents(); |
3300 table3.resizeRowsToContents(); |
3267 |
3301 |
3268 //now let's check the row/col sizes |
3302 //now let's check the row/col sizes |
3269 for(int i = 0;i<table.columnCount();i++) { |
3303 for(int i = 0;i<table.columnCount();i++) { |
3270 QVERIFY( table.columnWidth(i) == table2.columnWidth(i)); |
3304 QCOMPARE( table.columnWidth(i), table2.columnWidth(i)); |
3271 QVERIFY( table2.columnWidth(i) == table3.columnWidth(i)); |
3305 QCOMPARE( table2.columnWidth(i), table3.columnWidth(i)); |
3272 } |
3306 } |
3273 for(int i = 0;i<table.rowCount();i++) { |
3307 for(int i = 0;i<table.rowCount();i++) { |
3274 QVERIFY( table.rowHeight(i) == table2.rowHeight(i)); |
3308 QCOMPARE( table.rowHeight(i), table2.rowHeight(i)); |
3275 QVERIFY( table2.rowHeight(i) == table3.rowHeight(i)); |
3309 QCOMPARE( table2.rowHeight(i), table3.rowHeight(i)); |
3276 } |
3310 } |
3277 |
3311 |
3278 } |
3312 } |
3279 |
3313 |
3280 QT_BEGIN_NAMESPACE |
3314 QT_BEGIN_NAMESPACE |
3586 << int(QAbstractItemView::ScrollPerItem) << 120 |
3620 << int(QAbstractItemView::ScrollPerItem) << 120 |
3587 << 10 - qApp->wheelScrollLines() << 10 - qApp->wheelScrollLines(); |
3621 << 10 - qApp->wheelScrollLines() << 10 - qApp->wheelScrollLines(); |
3588 QTest::newRow("scroll down per item") |
3622 QTest::newRow("scroll down per item") |
3589 << int(QAbstractItemView::ScrollPerItem) << -120 |
3623 << int(QAbstractItemView::ScrollPerItem) << -120 |
3590 << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines(); |
3624 << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines(); |
3591 #ifdef Q_WS_MAC |
|
3592 // On Mac, we always scroll one pixel per 120 delta (rather than multiplying with |
|
3593 // singleStep) since wheel events are accelerated by the OS. |
|
3594 QTest::newRow("scroll down per pixel") |
|
3595 << int(QAbstractItemView::ScrollPerPixel) << -120 |
|
3596 << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines(); |
|
3597 #else |
|
3598 QTest::newRow("scroll down per pixel") |
3625 QTest::newRow("scroll down per pixel") |
3599 << int(QAbstractItemView::ScrollPerPixel) << -120 |
3626 << int(QAbstractItemView::ScrollPerPixel) << -120 |
3600 << 10 + qApp->wheelScrollLines() * 89 << 10 + qApp->wheelScrollLines() * 28; |
3627 << 10 + qApp->wheelScrollLines() * 89 << 10 + qApp->wheelScrollLines() * 28; |
3601 #endif |
|
3602 } |
3628 } |
3603 |
3629 |
3604 void tst_QTableView::mouseWheel() |
3630 void tst_QTableView::mouseWheel() |
3605 { |
3631 { |
3606 #ifdef Q_OS_WINCE |
3632 #ifdef Q_OS_WINCE |
3842 h->setSortIndicator(0, Qt::DescendingOrder); |
3868 h->setSortIndicator(0, Qt::DescendingOrder); |
3843 QApplication::processEvents(); |
3869 QApplication::processEvents(); |
3844 QCOMPARE(model.stringList() , sortedDataD); |
3870 QCOMPARE(model.stringList() , sortedDataD); |
3845 } |
3871 } |
3846 |
3872 |
|
3873 void tst_QTableView::taskQTBUG_5062_spansInconsistency() |
|
3874 { |
|
3875 const int nRows = 5; |
|
3876 const int nColumns = 5; |
|
3877 |
|
3878 QtTestTableModel model(nRows, nColumns); |
|
3879 QtTestTableView view; |
|
3880 view.setModel(&model); |
|
3881 |
|
3882 for (int i = 0; i < nRows; ++i) |
|
3883 view.setSpan(i, 0, 1, nColumns); |
|
3884 view.setSpan(2, 0, 1, 1); |
|
3885 view.setSpan(3, 0, 1, 1); |
|
3886 |
|
3887 VERIFY_SPANS_CONSISTENCY(&view); |
|
3888 } |
|
3889 |
|
3890 void tst_QTableView::taskQTBUG_4516_clickOnRichTextLabel() |
|
3891 { |
|
3892 QTableView view; |
|
3893 QStandardItemModel model(5,5); |
|
3894 view.setModel(&model); |
|
3895 QLabel label("rich text"); |
|
3896 label.setTextFormat(Qt::RichText); |
|
3897 view.setIndexWidget(model.index(1,1), &label); |
|
3898 view.setCurrentIndex(model.index(0,0)); |
|
3899 QCOMPARE(view.currentIndex(), model.index(0,0)); |
|
3900 |
|
3901 QTest::mouseClick(&label, Qt::LeftButton); |
|
3902 QCOMPARE(view.currentIndex(), model.index(1,1)); |
|
3903 |
|
3904 |
|
3905 } |
|
3906 |
|
3907 |
|
3908 void tst_QTableView::changeHeaderData() |
|
3909 { |
|
3910 QTableView view; |
|
3911 QStandardItemModel model(5,5); |
|
3912 view.setModel(&model); |
|
3913 view.show(); |
|
3914 QTest::qWaitForWindowShown(&view); |
|
3915 |
|
3916 QString text = "long long long text"; |
|
3917 const int textWidth = view.verticalHeader()->fontMetrics().width(text); |
|
3918 QVERIFY(view.verticalHeader()->width() < textWidth); |
|
3919 |
|
3920 model.setHeaderData(2, Qt::Vertical, text); |
|
3921 QTest::qWait(100); //leave time for layout |
|
3922 |
|
3923 QVERIFY(view.verticalHeader()->width() > textWidth); |
|
3924 } |
|
3925 |
|
3926 void tst_QTableView::taskQTBUG_5237_wheelEventOnHeader() |
|
3927 { |
|
3928 QTableView view; |
|
3929 QStandardItemModel model(500,5); |
|
3930 view.setModel(&model); |
|
3931 view.show(); |
|
3932 QTest::qWaitForWindowShown(&view); |
|
3933 |
|
3934 int sbValueBefore = view.verticalScrollBar()->value(); |
|
3935 QHeaderView *header = view.verticalHeader(); |
|
3936 QTest::mouseMove(header); |
|
3937 QWheelEvent wheelEvent(header->geometry().center(), -720, 0, 0); |
|
3938 QApplication::sendEvent(header->viewport(), &wheelEvent); |
|
3939 int sbValueAfter = view.verticalScrollBar()->value(); |
|
3940 QVERIFY(sbValueBefore != sbValueAfter); |
|
3941 } |
|
3942 |
3847 QTEST_MAIN(tst_QTableView) |
3943 QTEST_MAIN(tst_QTableView) |
3848 #include "tst_qtableview.moc" |
3944 #include "tst_qtableview.moc" |