|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the test suite of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 |
|
43 #include <QtGui/QtGui> |
|
44 #include <private/qtablewidget_p.h> |
|
45 #include <QtTest/QtTest> |
|
46 #include "../../shared/util.h" |
|
47 #include "private/qapplication_p.h" |
|
48 |
|
49 //TESTED_CLASS= |
|
50 //TESTED_FILES= |
|
51 |
|
52 // Will try to wait for the condition while allowing event processing |
|
53 // for a maximum of 2 seconds. |
|
54 #define WAIT_FOR_CONDITION(expr, expected) \ |
|
55 do { \ |
|
56 const int step = 100; \ |
|
57 for (int i = 0; i < 2000 && expr != expected; i+=step) { \ |
|
58 QTest::qWait(step); \ |
|
59 } \ |
|
60 } while(0) |
|
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 |
|
69 typedef QList<int> IntList; |
|
70 Q_DECLARE_METATYPE(IntList) |
|
71 |
|
72 typedef QList<bool> BoolList; |
|
73 Q_DECLARE_METATYPE(BoolList) |
|
74 |
|
75 class tst_QTableView : public QObject |
|
76 { |
|
77 Q_OBJECT |
|
78 |
|
79 public: |
|
80 tst_QTableView(); |
|
81 virtual ~tst_QTableView(); |
|
82 |
|
83 public slots: |
|
84 void initTestCase(); |
|
85 void cleanupTestCase(); |
|
86 void init(); |
|
87 void cleanup(); |
|
88 |
|
89 private slots: |
|
90 void getSetCheck(); |
|
91 |
|
92 void noDelegate(); |
|
93 void noModel(); |
|
94 void emptyModel(); |
|
95 |
|
96 void removeRows_data(); |
|
97 void removeRows(); |
|
98 |
|
99 void removeColumns_data(); |
|
100 void removeColumns(); |
|
101 |
|
102 void keyboardNavigation_data(); |
|
103 void keyboardNavigation(); |
|
104 |
|
105 void headerSections_data(); |
|
106 void headerSections(); |
|
107 |
|
108 void moveCursor_data(); |
|
109 void moveCursor(); |
|
110 |
|
111 void moveCursorStrikesBack_data(); |
|
112 void moveCursorStrikesBack(); |
|
113 |
|
114 void hideRows_data(); |
|
115 void hideRows(); |
|
116 |
|
117 void hideColumns_data(); |
|
118 void hideColumns(); |
|
119 |
|
120 void selection_data(); |
|
121 void selection(); |
|
122 |
|
123 void selectRow_data(); |
|
124 void selectRow(); |
|
125 |
|
126 void selectColumn_data(); |
|
127 void selectColumn(); |
|
128 |
|
129 void visualRect_data(); |
|
130 void visualRect(); |
|
131 |
|
132 void fetchMore(); |
|
133 void setHeaders(); |
|
134 |
|
135 void resizeRowsToContents_data(); |
|
136 void resizeRowsToContents(); |
|
137 |
|
138 void resizeColumnsToContents_data(); |
|
139 void resizeColumnsToContents(); |
|
140 |
|
141 void rowViewportPosition_data(); |
|
142 void rowViewportPosition(); |
|
143 |
|
144 void rowAt_data(); |
|
145 void rowAt(); |
|
146 |
|
147 void rowHeight_data(); |
|
148 void rowHeight(); |
|
149 |
|
150 void columnViewportPosition_data(); |
|
151 void columnViewportPosition(); |
|
152 |
|
153 void columnAt_data(); |
|
154 void columnAt(); |
|
155 |
|
156 void columnWidth_data(); |
|
157 void columnWidth(); |
|
158 |
|
159 void hiddenRow_data(); |
|
160 void hiddenRow(); |
|
161 |
|
162 void hiddenColumn_data(); |
|
163 void hiddenColumn(); |
|
164 |
|
165 void sortingEnabled_data(); |
|
166 void sortingEnabled(); |
|
167 |
|
168 void scrollTo_data(); |
|
169 void scrollTo(); |
|
170 |
|
171 void indexAt_data(); |
|
172 void indexAt(); |
|
173 |
|
174 void span_data(); |
|
175 void span(); |
|
176 void spans(); |
|
177 void spans_data(); |
|
178 void spansAfterRowInsertion(); |
|
179 void spansAfterColumnInsertion(); |
|
180 void spansAfterRowRemoval(); |
|
181 void spansAfterColumnRemoval(); |
|
182 |
|
183 void checkHeaderReset(); |
|
184 void checkHeaderMinSize(); |
|
185 |
|
186 void resizeToContents(); |
|
187 |
|
188 void tabFocus(); |
|
189 void bigModel(); |
|
190 void selectionSignal(); |
|
191 |
|
192 // task-specific tests: |
|
193 void task173773_updateVerticalHeader(); |
|
194 void task227953_setRootIndex(); |
|
195 void task240266_veryBigColumn(); |
|
196 void task248688_autoScrollNavigation(); |
|
197 void task259308_scrollVerticalHeaderSwappedSections(); |
|
198 void task191545_dragSelectRows(); |
|
199 void taskQTBUG_5062_spansInconsistency(); |
|
200 void taskQTBUG_4516_clickOnRichTextLabel(); |
|
201 void taskQTBUG_5237_wheelEventOnHeader(); |
|
202 void taskQTBUG_8585_crashForNoGoodReason(); |
|
203 void taskQTBUG_7774_RtoLVisualRegionForSelection(); |
|
204 void taskQTBUG_8777_scrollToSpans(); |
|
205 |
|
206 void mouseWheel_data(); |
|
207 void mouseWheel(); |
|
208 |
|
209 void addColumnWhileEditing(); |
|
210 void task234926_setHeaderSorting(); |
|
211 |
|
212 void changeHeaderData(); |
|
213 }; |
|
214 |
|
215 // Testing get/set functions |
|
216 void tst_QTableView::getSetCheck() |
|
217 { |
|
218 QTableView obj1; |
|
219 |
|
220 obj1.setSortingEnabled(false); |
|
221 QCOMPARE(false, obj1.isSortingEnabled()); |
|
222 obj1.setSortingEnabled(true); |
|
223 QCOMPARE(true, obj1.isSortingEnabled()); |
|
224 |
|
225 obj1.setShowGrid(false); |
|
226 QCOMPARE(false, obj1.showGrid()); |
|
227 obj1.setShowGrid(true); |
|
228 QCOMPARE(true, obj1.showGrid()); |
|
229 |
|
230 obj1.setGridStyle(Qt::NoPen); |
|
231 QCOMPARE(Qt::NoPen, obj1.gridStyle()); |
|
232 obj1.setGridStyle(Qt::SolidLine); |
|
233 QCOMPARE(Qt::SolidLine, obj1.gridStyle()); |
|
234 |
|
235 obj1.setRootIndex(QModelIndex()); |
|
236 QCOMPARE(QModelIndex(), obj1.rootIndex()); |
|
237 QStandardItemModel model(10, 10); |
|
238 obj1.setModel(&model); |
|
239 QModelIndex index = model.index(0, 0); |
|
240 obj1.setRootIndex(index); |
|
241 QCOMPARE(index, obj1.rootIndex()); |
|
242 |
|
243 QHeaderView *var1 = new QHeaderView(Qt::Horizontal); |
|
244 obj1.setHorizontalHeader(var1); |
|
245 QCOMPARE(var1, obj1.horizontalHeader()); |
|
246 obj1.setHorizontalHeader((QHeaderView *)0); |
|
247 QCOMPARE(var1, obj1.horizontalHeader()); |
|
248 delete var1; |
|
249 |
|
250 QHeaderView *var2 = new QHeaderView(Qt::Vertical); |
|
251 obj1.setVerticalHeader(var2); |
|
252 QCOMPARE(var2, obj1.verticalHeader()); |
|
253 obj1.setVerticalHeader((QHeaderView *)0); |
|
254 QCOMPARE(var2, obj1.verticalHeader()); |
|
255 delete var2; |
|
256 |
|
257 QCOMPARE(obj1.isCornerButtonEnabled(), true); |
|
258 obj1.setCornerButtonEnabled(false); |
|
259 QCOMPARE(obj1.isCornerButtonEnabled(), false); |
|
260 } |
|
261 |
|
262 class QtTestTableModel: public QAbstractTableModel |
|
263 { |
|
264 Q_OBJECT |
|
265 |
|
266 signals: |
|
267 void invalidIndexEncountered() const; |
|
268 |
|
269 public: |
|
270 QtTestTableModel(int rows = 0, int columns = 0, QObject *parent = 0) |
|
271 : QAbstractTableModel(parent), |
|
272 row_count(rows), |
|
273 column_count(columns), |
|
274 can_fetch_more(false), |
|
275 fetch_more_count(0), |
|
276 disabled_rows(), |
|
277 disabled_columns() {} |
|
278 |
|
279 int rowCount(const QModelIndex& = QModelIndex()) const { return row_count; } |
|
280 int columnCount(const QModelIndex& = QModelIndex()) const { return column_count; } |
|
281 bool isEditable(const QModelIndex &) const { return true; } |
|
282 |
|
283 Qt::ItemFlags flags(const QModelIndex &index) const |
|
284 { |
|
285 Qt::ItemFlags index_flags = QAbstractTableModel::flags(index); |
|
286 if (disabled_rows.contains(index.row()) |
|
287 || disabled_columns.contains(index.column())) |
|
288 index_flags &= ~Qt::ItemIsEnabled; |
|
289 return index_flags; |
|
290 } |
|
291 |
|
292 void disableRow(int row) |
|
293 { |
|
294 disabled_rows.insert(row); |
|
295 } |
|
296 |
|
297 void enableRow(int row) |
|
298 { |
|
299 disabled_rows.remove(row); |
|
300 } |
|
301 |
|
302 void disableColumn(int column) |
|
303 { |
|
304 disabled_columns.insert(column); |
|
305 } |
|
306 |
|
307 void enableColumn(int column) |
|
308 { |
|
309 disabled_columns.remove(column); |
|
310 } |
|
311 |
|
312 QVariant data(const QModelIndex &idx, int role) const |
|
313 { |
|
314 if (!idx.isValid() || idx.row() >= row_count || idx.column() >= column_count) { |
|
315 qWarning() << "Invalid modelIndex [%d,%d,%p]" << idx; |
|
316 emit invalidIndexEncountered(); |
|
317 return QVariant(); |
|
318 } |
|
319 |
|
320 if (role == Qt::DisplayRole || role == Qt::EditRole) |
|
321 return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0); |
|
322 |
|
323 return QVariant(); |
|
324 } |
|
325 |
|
326 bool insertRows(int start, int count, const QModelIndex &parent = QModelIndex()) |
|
327 { |
|
328 if (start < 0 || start > row_count) |
|
329 return false; |
|
330 |
|
331 beginInsertRows(parent, start, start + count - 1); |
|
332 row_count += count; |
|
333 endInsertRows(); |
|
334 return true; |
|
335 } |
|
336 |
|
337 bool removeRows(int start, int count, const QModelIndex &parent = QModelIndex()) |
|
338 { |
|
339 if (start < 0 || start >= row_count || row_count < count) |
|
340 return false; |
|
341 |
|
342 beginRemoveRows(parent, start, start + count - 1); |
|
343 row_count -= count; |
|
344 endRemoveRows(); |
|
345 return true; |
|
346 } |
|
347 |
|
348 void removeLastRow() |
|
349 { |
|
350 beginRemoveRows(QModelIndex(), row_count - 1, row_count - 1); |
|
351 --row_count; |
|
352 endRemoveRows(); |
|
353 } |
|
354 |
|
355 void removeAllRows() |
|
356 { |
|
357 beginRemoveRows(QModelIndex(), 0, row_count - 1); |
|
358 row_count = 0; |
|
359 endRemoveRows(); |
|
360 } |
|
361 |
|
362 bool insertColumns(int start, int count, const QModelIndex &parent = QModelIndex()) |
|
363 { |
|
364 if (start < 0 || start > column_count) |
|
365 return false; |
|
366 |
|
367 beginInsertColumns(parent, start, start + count - 1); |
|
368 column_count += count; |
|
369 endInsertColumns(); |
|
370 return true; |
|
371 } |
|
372 |
|
373 bool removeColumns(int start, int count, const QModelIndex &parent = QModelIndex()) |
|
374 { |
|
375 if (start < 0 || start >= column_count || column_count < count) |
|
376 return false; |
|
377 |
|
378 beginRemoveColumns(parent, start, start + count - 1); |
|
379 column_count -= count; |
|
380 endRemoveColumns(); |
|
381 return true; |
|
382 } |
|
383 |
|
384 void removeLastColumn() |
|
385 { |
|
386 beginRemoveColumns(QModelIndex(), column_count - 1, column_count - 1); |
|
387 --column_count; |
|
388 endRemoveColumns(); |
|
389 } |
|
390 |
|
391 void removeAllColumns() |
|
392 { |
|
393 beginRemoveColumns(QModelIndex(), 0, column_count - 1); |
|
394 column_count = 0; |
|
395 endRemoveColumns(); |
|
396 } |
|
397 |
|
398 bool canFetchMore(const QModelIndex &) const |
|
399 { |
|
400 return can_fetch_more; |
|
401 } |
|
402 |
|
403 void fetchMore(const QModelIndex &) |
|
404 { |
|
405 ++fetch_more_count; |
|
406 } |
|
407 |
|
408 void reset() |
|
409 { |
|
410 QAbstractTableModel::reset(); |
|
411 } |
|
412 |
|
413 int row_count; |
|
414 int column_count; |
|
415 bool can_fetch_more; |
|
416 int fetch_more_count; |
|
417 QSet<int> disabled_rows; |
|
418 QSet<int> disabled_columns; |
|
419 }; |
|
420 |
|
421 class QtTestTableView : public QTableView |
|
422 { |
|
423 Q_OBJECT |
|
424 |
|
425 public: |
|
426 QtTestTableView(QWidget *parent = 0) : QTableView(parent), checkSignalOrder(false), hasCurrentChanged(0), hasSelectionChanged(0) {} |
|
427 |
|
428 void setModel(QAbstractItemModel *model) |
|
429 { |
|
430 QTableView::setModel(model); |
|
431 connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), |
|
432 this, SLOT(currentChanged(QModelIndex,QModelIndex))); |
|
433 connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), |
|
434 this, SLOT(itemSelectionChanged(QItemSelection,QItemSelection))); |
|
435 } |
|
436 |
|
437 enum CursorAction { |
|
438 MoveUp = QAbstractItemView::MoveUp, |
|
439 MoveDown = QAbstractItemView::MoveDown, |
|
440 MoveLeft = QAbstractItemView::MoveLeft, |
|
441 MoveRight = QAbstractItemView::MoveRight, |
|
442 MoveHome = QAbstractItemView::MoveHome, |
|
443 MoveEnd = QAbstractItemView::MoveEnd, |
|
444 MovePageUp = QAbstractItemView::MovePageUp, |
|
445 MovePageDown = QAbstractItemView::MovePageDown, |
|
446 MoveNext = QAbstractItemView::MoveNext, |
|
447 MovePrevious = QAbstractItemView::MovePrevious |
|
448 }; |
|
449 |
|
450 QModelIndex moveCursor(QtTestTableView::CursorAction cursorAction, |
|
451 Qt::KeyboardModifiers modifiers) |
|
452 { |
|
453 return QTableView::moveCursor((QAbstractItemView::CursorAction)cursorAction, modifiers); |
|
454 } |
|
455 |
|
456 int columnWidthHint(int column) const |
|
457 { |
|
458 return sizeHintForColumn(column); |
|
459 } |
|
460 |
|
461 int rowHeightHint(int row) const |
|
462 { |
|
463 return sizeHintForRow(row); |
|
464 } |
|
465 |
|
466 bool isIndexHidden(const QModelIndex &index) const |
|
467 { |
|
468 return QTableView::isIndexHidden(index); |
|
469 } |
|
470 |
|
471 void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) |
|
472 { |
|
473 QTableView::setSelection(rect, command); |
|
474 } |
|
475 |
|
476 QModelIndexList selectedIndexes() const |
|
477 { |
|
478 return QTableView::selectedIndexes(); |
|
479 } |
|
480 |
|
481 bool checkSignalOrder; |
|
482 public slots: |
|
483 void currentChanged(QModelIndex , QModelIndex ) { |
|
484 hasCurrentChanged++; |
|
485 if (checkSignalOrder) |
|
486 QVERIFY(hasCurrentChanged > hasSelectionChanged); |
|
487 } |
|
488 |
|
489 void itemSelectionChanged(QItemSelection , QItemSelection ) { |
|
490 hasSelectionChanged++; |
|
491 if (checkSignalOrder) |
|
492 QVERIFY(hasCurrentChanged >= hasSelectionChanged); |
|
493 } |
|
494 private: |
|
495 int hasCurrentChanged; |
|
496 int hasSelectionChanged; |
|
497 |
|
498 }; |
|
499 |
|
500 class QtTestItemDelegate : public QItemDelegate |
|
501 { |
|
502 public: |
|
503 QSize sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const |
|
504 { |
|
505 return hint; |
|
506 } |
|
507 |
|
508 QSize hint; |
|
509 }; |
|
510 |
|
511 tst_QTableView::tst_QTableView() |
|
512 { |
|
513 } |
|
514 |
|
515 tst_QTableView::~tst_QTableView() |
|
516 { |
|
517 } |
|
518 |
|
519 void tst_QTableView::initTestCase() |
|
520 { |
|
521 #ifdef Q_OS_WINCE //disable magic for WindowsCE |
|
522 qApp->setAutoMaximizeThreshold(-1); |
|
523 #endif |
|
524 } |
|
525 |
|
526 void tst_QTableView::cleanupTestCase() |
|
527 { |
|
528 } |
|
529 |
|
530 void tst_QTableView::init() |
|
531 { |
|
532 } |
|
533 |
|
534 void tst_QTableView::cleanup() |
|
535 { |
|
536 } |
|
537 |
|
538 void tst_QTableView::noDelegate() |
|
539 { |
|
540 QtTestTableModel model(3, 3); |
|
541 QTableView view; |
|
542 view.setModel(&model); |
|
543 view.setItemDelegate(0); |
|
544 view.show(); |
|
545 } |
|
546 |
|
547 void tst_QTableView::noModel() |
|
548 { |
|
549 QTableView view; |
|
550 view.show(); |
|
551 } |
|
552 |
|
553 void tst_QTableView::emptyModel() |
|
554 { |
|
555 QtTestTableModel model; |
|
556 QTableView view; |
|
557 QSignalSpy spy(&model, SIGNAL(invalidIndexEncountered())); |
|
558 view.setModel(&model); |
|
559 view.show(); |
|
560 QCOMPARE(spy.count(), 0); |
|
561 } |
|
562 |
|
563 void tst_QTableView::removeRows_data() |
|
564 { |
|
565 QTest::addColumn<int>("rowCount"); |
|
566 QTest::addColumn<int>("columnCount"); |
|
567 |
|
568 QTest::newRow("2x2") << 2 << 2; |
|
569 QTest::newRow("10x10") << 10 << 10; |
|
570 } |
|
571 |
|
572 void tst_QTableView::removeRows() |
|
573 { |
|
574 QFETCH(int, rowCount); |
|
575 QFETCH(int, columnCount); |
|
576 |
|
577 QtTestTableModel model(rowCount, columnCount); |
|
578 QSignalSpy spy(&model, SIGNAL(invalidIndexEncountered())); |
|
579 |
|
580 QTableView view; |
|
581 view.setModel(&model); |
|
582 view.show(); |
|
583 |
|
584 model.removeLastRow(); |
|
585 QCOMPARE(spy.count(), 0); |
|
586 |
|
587 model.removeAllRows(); |
|
588 QCOMPARE(spy.count(), 0); |
|
589 } |
|
590 |
|
591 void tst_QTableView::removeColumns_data() |
|
592 { |
|
593 QTest::addColumn<int>("rowCount"); |
|
594 QTest::addColumn<int>("columnCount"); |
|
595 |
|
596 QTest::newRow("2x2") << 2 << 2; |
|
597 QTest::newRow("10x10") << 10 << 10; |
|
598 } |
|
599 |
|
600 void tst_QTableView::removeColumns() |
|
601 { |
|
602 QFETCH(int, rowCount); |
|
603 QFETCH(int, columnCount); |
|
604 |
|
605 QtTestTableModel model(rowCount, columnCount); |
|
606 QSignalSpy spy(&model, SIGNAL(invalidIndexEncountered())); |
|
607 |
|
608 QTableView view; |
|
609 view.setModel(&model); |
|
610 view.show(); |
|
611 |
|
612 model.removeLastColumn(); |
|
613 QCOMPARE(spy.count(), 0); |
|
614 |
|
615 model.removeAllColumns(); |
|
616 QCOMPARE(spy.count(), 0); |
|
617 } |
|
618 |
|
619 void tst_QTableView::keyboardNavigation_data() |
|
620 { |
|
621 QTest::addColumn<int>("rowCount"); |
|
622 QTest::addColumn<int>("columnCount"); |
|
623 QTest::addColumn<bool>("tabKeyNavigation"); |
|
624 QTest::addColumn<IntList>("keyPresses"); |
|
625 |
|
626 QTest::newRow("16x16 model") << 16 << 16 << true |
|
627 << (IntList() |
|
628 << Qt::Key_Up |
|
629 << Qt::Key_Up |
|
630 << Qt::Key_Right |
|
631 << Qt::Key_Right |
|
632 << Qt::Key_Up |
|
633 << Qt::Key_Left |
|
634 << Qt::Key_Left |
|
635 << Qt::Key_Up |
|
636 << Qt::Key_Down |
|
637 << Qt::Key_Up |
|
638 << Qt::Key_Up |
|
639 << Qt::Key_Up |
|
640 << Qt::Key_Up |
|
641 << Qt::Key_Up |
|
642 << Qt::Key_Up |
|
643 << Qt::Key_Left |
|
644 << Qt::Key_Left |
|
645 << Qt::Key_Up |
|
646 << Qt::Key_Down |
|
647 << Qt::Key_Down |
|
648 << Qt::Key_Tab |
|
649 << Qt::Key_Backtab); |
|
650 |
|
651 |
|
652 QTest::newRow("no tab") << 8 << 8 << false |
|
653 << (IntList() |
|
654 << Qt::Key_Up |
|
655 << Qt::Key_Up |
|
656 << Qt::Key_Right |
|
657 << Qt::Key_Right |
|
658 << Qt::Key_Up |
|
659 << Qt::Key_Left |
|
660 << Qt::Key_Left |
|
661 << Qt::Key_Up |
|
662 << Qt::Key_Down |
|
663 << Qt::Key_Up |
|
664 << Qt::Key_Up |
|
665 << Qt::Key_Up |
|
666 << Qt::Key_Up |
|
667 << Qt::Key_Up |
|
668 << Qt::Key_Up |
|
669 << Qt::Key_Left |
|
670 << Qt::Key_Left |
|
671 << Qt::Key_Up |
|
672 << Qt::Key_Down |
|
673 << Qt::Key_Down |
|
674 << Qt::Key_Tab |
|
675 << Qt::Key_Backtab); |
|
676 } |
|
677 |
|
678 void tst_QTableView::keyboardNavigation() |
|
679 { |
|
680 QFETCH(int, rowCount); |
|
681 QFETCH(int, columnCount); |
|
682 QFETCH(bool, tabKeyNavigation); |
|
683 QFETCH(IntList, keyPresses); |
|
684 |
|
685 QtTestTableModel model(rowCount, columnCount); |
|
686 QTableView view; |
|
687 view.setModel(&model); |
|
688 |
|
689 view.setTabKeyNavigation(tabKeyNavigation); |
|
690 QModelIndex index = model.index(rowCount - 1, columnCount - 1); |
|
691 view.setCurrentIndex(index); |
|
692 |
|
693 view.show(); |
|
694 QTest::qWaitForWindowShown(&view); |
|
695 qApp->setActiveWindow(&view); |
|
696 |
|
697 int row = rowCount - 1; |
|
698 int column = columnCount - 1; |
|
699 for (int i = 0; i < keyPresses.count(); ++i) { |
|
700 |
|
701 Qt::Key key = (Qt::Key)keyPresses.at(i); |
|
702 |
|
703 switch (key) { |
|
704 case Qt::Key_Up: |
|
705 row = qMax(0, row - 1); |
|
706 break; |
|
707 case Qt::Key_Down: |
|
708 row = qMin(rowCount - 1, row + 1); |
|
709 break; |
|
710 case Qt::Key_Backtab: |
|
711 if (!tabKeyNavigation) |
|
712 break; |
|
713 case Qt::Key_Left: |
|
714 column = qMax(0, column - 1); |
|
715 break; |
|
716 case Qt::Key_Tab: |
|
717 if (!tabKeyNavigation) |
|
718 break; |
|
719 case Qt::Key_Right: |
|
720 column = qMin(columnCount - 1, column + 1); |
|
721 break; |
|
722 default: |
|
723 break; |
|
724 } |
|
725 |
|
726 QTest::keyClick(&view, key); |
|
727 QApplication::processEvents(); |
|
728 |
|
729 QModelIndex index = model.index(row, column); |
|
730 QCOMPARE(view.currentIndex(), index); |
|
731 } |
|
732 } |
|
733 |
|
734 void tst_QTableView::headerSections_data() |
|
735 { |
|
736 QTest::addColumn<int>("rowCount"); |
|
737 QTest::addColumn<int>("columnCount"); |
|
738 QTest::addColumn<int>("row"); |
|
739 QTest::addColumn<int>("column"); |
|
740 QTest::addColumn<int>("rowHeight"); |
|
741 QTest::addColumn<int>("columnWidth"); |
|
742 |
|
743 QTest::newRow("") << 10 << 10 << 5 << 5 << 30 << 30; |
|
744 } |
|
745 |
|
746 void tst_QTableView::headerSections() |
|
747 { |
|
748 QFETCH(int, rowCount); |
|
749 QFETCH(int, columnCount); |
|
750 QFETCH(int, row); |
|
751 QFETCH(int, column); |
|
752 QFETCH(int, rowHeight); |
|
753 QFETCH(int, columnWidth); |
|
754 |
|
755 QtTestTableModel model(rowCount, columnCount); |
|
756 |
|
757 QTableView view; |
|
758 QHeaderView *hheader = view.horizontalHeader(); |
|
759 QHeaderView *vheader = view.verticalHeader(); |
|
760 |
|
761 view.setModel(&model); |
|
762 view.show(); |
|
763 |
|
764 hheader->doItemsLayout(); |
|
765 vheader->doItemsLayout(); |
|
766 |
|
767 QCOMPARE(hheader->count(), model.columnCount()); |
|
768 QCOMPARE(vheader->count(), model.rowCount()); |
|
769 |
|
770 view.setRowHeight(row, rowHeight); |
|
771 QCOMPARE(view.rowHeight(row), rowHeight); |
|
772 view.hideRow(row); |
|
773 QCOMPARE(view.rowHeight(row), 0); |
|
774 view.showRow(row); |
|
775 QCOMPARE(view.rowHeight(row), rowHeight); |
|
776 |
|
777 view.setColumnWidth(column, columnWidth); |
|
778 QCOMPARE(view.columnWidth(column), columnWidth); |
|
779 view.hideColumn(column); |
|
780 QCOMPARE(view.columnWidth(column), 0); |
|
781 view.showColumn(column); |
|
782 QCOMPARE(view.columnWidth(column), columnWidth); |
|
783 } |
|
784 |
|
785 typedef QPair<int,int> IntPair; |
|
786 Q_DECLARE_METATYPE(IntPair) |
|
787 |
|
788 void tst_QTableView::moveCursor_data() |
|
789 { |
|
790 QTest::addColumn<int>("rowCount"); |
|
791 QTest::addColumn<int>("columnCount"); |
|
792 QTest::addColumn<int>("hideRow"); |
|
793 QTest::addColumn<int>("hideColumn"); |
|
794 |
|
795 QTest::addColumn<int>("startRow"); |
|
796 QTest::addColumn<int>("startColumn"); |
|
797 |
|
798 QTest::addColumn<int>("cursorMoveAction"); |
|
799 QTest::addColumn<int>("modifier"); |
|
800 |
|
801 QTest::addColumn<int>("expectedRow"); |
|
802 QTest::addColumn<int>("expectedColumn"); |
|
803 QTest::addColumn<IntPair>("moveRow"); |
|
804 QTest::addColumn<IntPair>("moveColumn"); |
|
805 |
|
806 // MoveRight |
|
807 QTest::newRow("MoveRight (0,0)") |
|
808 << 4 << 4 << -1 << -1 |
|
809 << 0 << 0 |
|
810 << int(QtTestTableView::MoveRight) << int(Qt::NoModifier) |
|
811 << 0 << 1 << IntPair(0,0) << IntPair(0,0); |
|
812 |
|
813 QTest::newRow("MoveRight (3,0)") |
|
814 << 4 << 4 << -1 << -1 |
|
815 << 3 << 0 |
|
816 << int(QtTestTableView::MoveRight) << int(Qt::NoModifier) |
|
817 << 3 << 1 << IntPair(0,0) << IntPair(0,0); |
|
818 |
|
819 QTest::newRow("MoveRight (3,3)") |
|
820 << 4 << 4 << -1 << -1 |
|
821 << 3 << 3 |
|
822 << int(QtTestTableView::MoveRight) << int(Qt::NoModifier) |
|
823 << 3 << 3 << IntPair(0,0) << IntPair(0,0); // ### |
|
824 |
|
825 QTest::newRow("MoveRight, hidden column 1 (0,0)") |
|
826 << 4 << 4 << -1 << 1 |
|
827 << 0 << 0 |
|
828 << int(QtTestTableView::MoveRight) << int(Qt::NoModifier) |
|
829 << 0 << 2 << IntPair(0,0) << IntPair(0,0); |
|
830 |
|
831 QTest::newRow("MoveRight, hidden column 3 (0,2)") |
|
832 << 4 << 4 << -1 << 3 |
|
833 << 0 << 2 |
|
834 << int(QtTestTableView::MoveRight) << int(Qt::NoModifier) |
|
835 << 0 << 2 << IntPair(0,0) << IntPair(0,0); // ### |
|
836 |
|
837 // MoveNext should in addition wrap |
|
838 QTest::newRow("MoveNext (0,0)") |
|
839 << 4 << 4 << -1 << -1 |
|
840 << 0 << 0 |
|
841 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
842 << 0 << 1 << IntPair(0,0) << IntPair(0,0); |
|
843 |
|
844 QTest::newRow("MoveNext (0,2)") |
|
845 << 4 << 4 << -1 << -1 |
|
846 << 0 << 2 |
|
847 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
848 << 0 << 3 << IntPair(0,0) << IntPair(0,0); |
|
849 |
|
850 QTest::newRow("MoveNext, wrap (0,3)") |
|
851 << 4 << 4 << -1 << -1 |
|
852 << 0 << 3 |
|
853 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
854 << 1 << 0 << IntPair(0,0) << IntPair(0,0); |
|
855 |
|
856 QTest::newRow("MoveNext, wrap (3,3)") |
|
857 << 4 << 4 << -1 << -1 |
|
858 << 3 << 3 |
|
859 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
860 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
861 |
|
862 QTest::newRow("MoveNext, hidden column 1 (0,0)") |
|
863 << 4 << 4 << -1 << 1 |
|
864 << 0 << 0 |
|
865 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
866 << 0 << 2 << IntPair(0,0) << IntPair(0,0); |
|
867 |
|
868 QTest::newRow("MoveNext, wrap, hidden column 3 (0,2)") |
|
869 << 4 << 4 << -1 << 3 |
|
870 << 0 << 2 |
|
871 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
872 << 1 << 0 << IntPair(0,0) << IntPair(0,0); |
|
873 |
|
874 QTest::newRow("MoveNext, wrap, hidden column 3 (3,2)") |
|
875 << 4 << 4 << -1 << 3 |
|
876 << 3 << 2 |
|
877 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
878 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
879 |
|
880 QTest::newRow("MoveNext, wrapy, wrapx, hidden column 3, hidden row 3 (2,2)") |
|
881 << 4 << 4 << 3 << 3 |
|
882 << 2 << 2 |
|
883 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
884 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
885 |
|
886 QTest::newRow("MoveNext, wrap, hidden column 2, moved column from 3 to 0. (0,2)") |
|
887 << 4 << 4 << -1 << 2 |
|
888 << 0 << 2 |
|
889 << int(QtTestTableView::MoveNext) << int(Qt::NoModifier) |
|
890 << 1 << 3 << IntPair(0,0) << IntPair(3,0); |
|
891 |
|
892 // MoveLeft |
|
893 QTest::newRow("MoveLeft (0,0)") |
|
894 << 4 << 4 << -1 << -1 |
|
895 << 0 << 0 |
|
896 << int(QtTestTableView::MoveLeft) << int(Qt::NoModifier) |
|
897 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
898 |
|
899 QTest::newRow("MoveLeft (0,3)") |
|
900 << 4 << 4 << -1 << -1 |
|
901 << 0 << 3 |
|
902 << int(QtTestTableView::MoveLeft) << int(Qt::NoModifier) |
|
903 << 0 << 2 << IntPair(0,0) << IntPair(0,0); |
|
904 |
|
905 QTest::newRow("MoveLeft (1,0)") |
|
906 << 4 << 4 << -1 << -1 |
|
907 << 1 << 0 |
|
908 << int(QtTestTableView::MoveLeft) << int(Qt::NoModifier) |
|
909 << 1 << 0 << IntPair(0,0) << IntPair(0,0); |
|
910 |
|
911 QTest::newRow("MoveLeft, hidden column 0 (0,2)") |
|
912 << 4 << 4 << -1 << 1 |
|
913 << 0 << 2 |
|
914 << int(QtTestTableView::MoveLeft) << int(Qt::NoModifier) |
|
915 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
916 |
|
917 QTest::newRow("MoveLeft, hidden column 0 (0,1)") |
|
918 << 4 << 4 << -1 << 0 |
|
919 << 0 << 1 |
|
920 << int(QtTestTableView::MoveLeft) << int(Qt::NoModifier) |
|
921 << 0 << 1 << IntPair(0,0) << IntPair(0,0); |
|
922 |
|
923 // MovePrevious should in addition wrap |
|
924 QTest::newRow("MovePrevious (0,3)") |
|
925 << 4 << 4 << -1 << -1 |
|
926 << 0 << 3 |
|
927 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
928 << 0 << 2 << IntPair(0,0) << IntPair(0,0); |
|
929 |
|
930 QTest::newRow("MovePrevious (0,1)") |
|
931 << 4 << 4 << -1 << -1 |
|
932 << 0 << 1 |
|
933 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
934 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
935 |
|
936 QTest::newRow("MovePrevious, wrap (1,0)") |
|
937 << 4 << 4 << -1 << -1 |
|
938 << 1 << 0 |
|
939 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
940 << 0 << 3 << IntPair(0,0) << IntPair(0,0); |
|
941 |
|
942 QTest::newRow("MovePrevious, wrap, (0,0)") |
|
943 << 4 << 4 << -1 << -1 |
|
944 << 0 << 0 |
|
945 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
946 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
947 |
|
948 QTest::newRow("MovePrevious, hidden column 1 (0,2)") |
|
949 << 4 << 4 << -1 << 1 |
|
950 << 0 << 2 |
|
951 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
952 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
953 |
|
954 QTest::newRow("MovePrevious, wrap, hidden column 3 (0,2)") |
|
955 << 4 << 4 << -1 << 3 |
|
956 << 0 << 2 |
|
957 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
958 << 0 << 1 << IntPair(0,0) << IntPair(0,0); |
|
959 |
|
960 QTest::newRow("MovePrevious, wrapy, hidden column 0 (0,1)") |
|
961 << 4 << 4 << -1 << 0 |
|
962 << 0 << 1 |
|
963 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
964 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
965 |
|
966 QTest::newRow("MovePrevious, wrap, hidden column 0, hidden row 0 (1,1)") |
|
967 << 4 << 4 << 0 << 0 |
|
968 << 1 << 1 |
|
969 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
970 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
971 |
|
972 QTest::newRow("MovePrevious, wrap, hidden column 1, moved column from 0 to 3. (1,2)") |
|
973 << 4 << 4 << -1 << 1 |
|
974 << 1 << 2 |
|
975 << int(QtTestTableView::MovePrevious) << int(Qt::NoModifier) |
|
976 << 0 << 0 << IntPair(0,0) << IntPair(0,3); |
|
977 |
|
978 // MoveDown |
|
979 QTest::newRow("MoveDown (0,0)") |
|
980 << 4 << 4 << -1 << -1 |
|
981 << 0 << 0 |
|
982 << int(QtTestTableView::MoveDown) << int(Qt::NoModifier) |
|
983 << 1 << 0 << IntPair(0,0) << IntPair(0,0); |
|
984 |
|
985 QTest::newRow("MoveDown (3,0)") |
|
986 << 4 << 4 << -1 << -1 |
|
987 << 3 << 0 |
|
988 << int(QtTestTableView::MoveDown) << int(Qt::NoModifier) |
|
989 << 3 << 0 << IntPair(0,0) << IntPair(0,0); |
|
990 |
|
991 QTest::newRow("MoveDown (3,3)") |
|
992 << 4 << 4 << -1 << -1 |
|
993 << 3 << 3 |
|
994 << int(QtTestTableView::MoveDown) << int(Qt::NoModifier) |
|
995 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
996 |
|
997 QTest::newRow("MoveDown, hidden row 1 (0,0)") |
|
998 << 4 << 4 << 1 << -1 |
|
999 << 0 << 0 |
|
1000 << int(QtTestTableView::MoveDown) << int(Qt::NoModifier) |
|
1001 << 2 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1002 |
|
1003 QTest::newRow("MoveDown, hidden row 3 (2,0)") |
|
1004 << 4 << 4 << 3 << -1 |
|
1005 << 2 << 0 |
|
1006 << int(QtTestTableView::MoveDown) << int(Qt::NoModifier) |
|
1007 << 2 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1008 |
|
1009 QTest::newRow("MoveDown, hidden row 0 hidden column 0 (0,0)") |
|
1010 << 4 << 4 << 0 << 0 |
|
1011 << 0 << 0 |
|
1012 << int(QtTestTableView::MoveDown) << int(Qt::NoModifier) |
|
1013 << 1 << 1 << IntPair(0,0) << IntPair(0,0); |
|
1014 |
|
1015 // MoveUp |
|
1016 QTest::newRow("MoveUp (0,0)") |
|
1017 << 4 << 4 << -1 << -1 |
|
1018 << 0 << 0 |
|
1019 << int(QtTestTableView::MoveUp) << int(Qt::NoModifier) |
|
1020 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1021 |
|
1022 QTest::newRow("MoveUp (3, 0)") |
|
1023 << 4 << 4 << -1 << -1 |
|
1024 << 3 << 0 |
|
1025 << int(QtTestTableView::MoveUp) << int(Qt::NoModifier) |
|
1026 << 2 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1027 |
|
1028 QTest::newRow("MoveUp (0,1)") |
|
1029 << 4 << 4 << -1 << -1 |
|
1030 << 0 << 1 |
|
1031 << int(QtTestTableView::MoveUp) << int(Qt::NoModifier) |
|
1032 << 0 << 1 << IntPair(0,0) << IntPair(0,0); |
|
1033 |
|
1034 QTest::newRow("MoveUp, hidden row 1 (2,0)") |
|
1035 << 4 << 4 << 1 << -1 |
|
1036 << 2 << 0 |
|
1037 << int(QtTestTableView::MoveUp) << int(Qt::NoModifier) |
|
1038 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1039 |
|
1040 QTest::newRow("MoveUp, hidden row (1,0)") |
|
1041 << 4 << 4 << 0 << -1 |
|
1042 << 1 << 0 |
|
1043 << int(QtTestTableView::MoveUp) << int(Qt::NoModifier) |
|
1044 << 1 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1045 |
|
1046 // MoveHome |
|
1047 QTest::newRow("MoveHome (0,0)") |
|
1048 << 4 << 4 << -1 << -1 |
|
1049 << 0 << 0 |
|
1050 << int(QtTestTableView::MoveHome) << int(Qt::NoModifier) |
|
1051 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1052 |
|
1053 QTest::newRow("MoveHome (3,3)") |
|
1054 << 4 << 4 << -1 << -1 |
|
1055 << 3 << 3 |
|
1056 << int(QtTestTableView::MoveHome) << int(Qt::NoModifier) |
|
1057 << 3 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1058 |
|
1059 QTest::newRow("MoveHome, hidden column 0 (3,3)") |
|
1060 << 4 << 4 << -1 << 0 |
|
1061 << 3 << 3 |
|
1062 << int(QtTestTableView::MoveHome) << int(Qt::NoModifier) |
|
1063 << 3 << 1 << IntPair(0,0) << IntPair(0,0); |
|
1064 |
|
1065 // Use Ctrl modifier |
|
1066 QTest::newRow("MoveHome + Ctrl (0,0)") |
|
1067 << 4 << 4 << -1 << -1 |
|
1068 << 0 << 0 |
|
1069 << int(QtTestTableView::MoveHome) << int(Qt::ControlModifier) |
|
1070 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1071 |
|
1072 QTest::newRow("MoveHome + Ctrl (3,3)") |
|
1073 << 4 << 4 << -1 << -1 |
|
1074 << 3 << 3 |
|
1075 << int(QtTestTableView::MoveHome) << int(Qt::ControlModifier) |
|
1076 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1077 |
|
1078 QTest::newRow("MoveHome + Ctrl, hidden column 0, hidden row 0 (3,3)") |
|
1079 << 4 << 4 << 0 << 0 |
|
1080 << 3 << 3 |
|
1081 << int(QtTestTableView::MoveHome) << int(Qt::ControlModifier) |
|
1082 << 1 << 1 << IntPair(0,0) << IntPair(0,0); |
|
1083 |
|
1084 // MoveEnd |
|
1085 QTest::newRow("MoveEnd (0,0)") |
|
1086 << 4 << 4 << -1 << -1 |
|
1087 << 0 << 0 |
|
1088 << int(QtTestTableView::MoveEnd) << int(Qt::NoModifier) |
|
1089 << 0 << 3 << IntPair(0,0) << IntPair(0,0); |
|
1090 |
|
1091 QTest::newRow("MoveEnd (3,3)") |
|
1092 << 4 << 4 << -1 << -1 |
|
1093 << 3 << 3 |
|
1094 << int(QtTestTableView::MoveEnd) << int(Qt::NoModifier) |
|
1095 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
1096 |
|
1097 QTest::newRow("MoveEnd, hidden column (0,0)") |
|
1098 << 4 << 4 << -1 << 3 |
|
1099 << 0 << 0 |
|
1100 << int(QtTestTableView::MoveEnd) << int(Qt::NoModifier) |
|
1101 << 0<< 2 << IntPair(0,0) << IntPair(0,0); |
|
1102 |
|
1103 // Use Ctrl modifier |
|
1104 QTest::newRow("MoveEnd + Ctrl (0,0)") |
|
1105 << 4 << 4 << -1 << -1 |
|
1106 << 0 << 0 |
|
1107 << int(QtTestTableView::MoveEnd) << int(Qt::ControlModifier) |
|
1108 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
1109 |
|
1110 QTest::newRow("MoveEnd + Ctrl (3,3)") |
|
1111 << 4 << 4 << -1 << -1 |
|
1112 << 3 << 3 |
|
1113 << int(QtTestTableView::MoveEnd) << int(Qt::ControlModifier) |
|
1114 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
1115 |
|
1116 QTest::newRow("MoveEnd + Ctrl, hidden column 3 (0,0)") |
|
1117 << 4 << 4 << -1 << 3 |
|
1118 << 0 << 0 |
|
1119 << int(QtTestTableView::MoveEnd) << int(Qt::ControlModifier) |
|
1120 << 3 << 2 << IntPair(0,0) << IntPair(0,0); |
|
1121 |
|
1122 QTest::newRow("MoveEnd + Ctrl, hidden column 3, hidden row 3 (0,0)") |
|
1123 << 4 << 4 << 3 << 3 |
|
1124 << 0 << 0 |
|
1125 << int(QtTestTableView::MoveEnd) << int(Qt::ControlModifier) |
|
1126 << 2 << 2 << IntPair(0,0) << IntPair(0,0); |
|
1127 |
|
1128 QTest::newRow("MovePageUp (0,0)") |
|
1129 << 4 << 4 << -1 << -1 |
|
1130 << 0 << 0 |
|
1131 << int(QtTestTableView::MovePageUp) << 0 |
|
1132 << 0 << 0 << IntPair(0,0) << IntPair(0,0); |
|
1133 |
|
1134 QTest::newRow("MovePageUp (3,3)") |
|
1135 << 4 << 4 << -1 << -1 |
|
1136 << 3 << 3 |
|
1137 << int(QtTestTableView::MovePageUp) << 0 |
|
1138 << 0 << 3 << IntPair(0,0) << IntPair(0,0); |
|
1139 |
|
1140 QTest::newRow("MovePageDown (3, 3)") |
|
1141 << 4 << 4 << -1 << -1 |
|
1142 << 3 << 3 |
|
1143 << int(QtTestTableView::MovePageDown) << 0 |
|
1144 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
1145 |
|
1146 QTest::newRow("MovePageDown (0, 3)") |
|
1147 << 4 << 4 << -1 << -1 |
|
1148 << 0 << 3 |
|
1149 << int(QtTestTableView::MovePageDown) << 0 |
|
1150 << 3 << 3 << IntPair(0,0) << IntPair(0,0); |
|
1151 } |
|
1152 |
|
1153 void tst_QTableView::moveCursor() |
|
1154 { |
|
1155 QFETCH(int, rowCount); |
|
1156 QFETCH(int, columnCount); |
|
1157 QFETCH(int, hideRow); |
|
1158 QFETCH(int, hideColumn); |
|
1159 QFETCH(int, startRow); |
|
1160 QFETCH(int, startColumn); |
|
1161 QFETCH(int, cursorMoveAction); |
|
1162 QFETCH(int, modifier); |
|
1163 QFETCH(int, expectedRow); |
|
1164 QFETCH(int, expectedColumn); |
|
1165 QFETCH(IntPair, moveRow); |
|
1166 QFETCH(IntPair, moveColumn); |
|
1167 |
|
1168 QtTestTableModel model(rowCount, columnCount); |
|
1169 QtTestTableView view; |
|
1170 |
|
1171 view.setModel(&model); |
|
1172 view.hideRow(hideRow); |
|
1173 view.hideColumn(hideColumn); |
|
1174 if (moveColumn.first != moveColumn.second) |
|
1175 view.horizontalHeader()->moveSection(moveColumn.first, moveColumn.second); |
|
1176 if (moveRow.first != moveRow.second) |
|
1177 view.verticalHeader()->moveSection(moveRow.first, moveRow.second); |
|
1178 |
|
1179 view.show(); |
|
1180 |
|
1181 QModelIndex index = model.index(startRow, startColumn); |
|
1182 view.setCurrentIndex(index); |
|
1183 |
|
1184 QModelIndex newIndex = view.moveCursor((QtTestTableView::CursorAction)cursorMoveAction, |
|
1185 (Qt::KeyboardModifiers)modifier); |
|
1186 // expected fails, task 119433 |
|
1187 if(newIndex.row() == -1) |
|
1188 return; |
|
1189 QCOMPARE(newIndex.row(), expectedRow); |
|
1190 QCOMPARE(newIndex.column(), expectedColumn); |
|
1191 } |
|
1192 |
|
1193 void tst_QTableView::moveCursorStrikesBack_data() |
|
1194 { |
|
1195 QTest::addColumn<int>("hideRow"); |
|
1196 QTest::addColumn<int>("hideColumn"); |
|
1197 QTest::addColumn<IntList>("disableRows"); |
|
1198 QTest::addColumn<IntList>("disableColumns"); |
|
1199 QTest::addColumn<QRect>("span"); |
|
1200 |
|
1201 QTest::addColumn<int>("startRow"); |
|
1202 QTest::addColumn<int>("startColumn"); |
|
1203 QTest::addColumn<IntList>("cursorMoveActions"); |
|
1204 QTest::addColumn<int>("expectedRow"); |
|
1205 QTest::addColumn<int>("expectedColumn"); |
|
1206 |
|
1207 QTest::newRow("Last column disabled. Task QTBUG-3878") << -1 << -1 |
|
1208 << IntList() |
|
1209 << (IntList() << 6) |
|
1210 << QRect() |
|
1211 << 0 << 5 << (IntList() << int(QtTestTableView::MoveNext)) |
|
1212 << 1 << 0; |
|
1213 |
|
1214 QTest::newRow("Last column disabled. Task QTBUG-3878") << -1 << -1 |
|
1215 << IntList() |
|
1216 << (IntList() << 6) |
|
1217 << QRect() |
|
1218 << 1 << 0 << (IntList() << int(QtTestTableView::MovePrevious)) |
|
1219 << 0 << 5; |
|
1220 |
|
1221 QTest::newRow("Span, anchor column hidden") << -1 << 1 |
|
1222 << IntList() |
|
1223 << IntList() |
|
1224 << QRect(1, 2, 2, 3) |
|
1225 << 2 << 0 << (IntList() << int(QtTestTableView::MoveNext)) |
|
1226 << 2 << 2; |
|
1227 |
|
1228 QTest::newRow("Span, anchor column disabled") << -1 << -1 |
|
1229 << IntList() |
|
1230 << (IntList() << 1) |
|
1231 << QRect(1, 2, 2, 3) |
|
1232 << 2 << 0 << (IntList() << int(QtTestTableView::MoveNext)) |
|
1233 << 2 << 2; |
|
1234 |
|
1235 QTest::newRow("Span, anchor row hidden") << 2 << -1 |
|
1236 << IntList() |
|
1237 << IntList() |
|
1238 << QRect(1, 2, 2, 3) |
|
1239 << 1 << 2 << (IntList() << int(QtTestTableView::MoveDown)) |
|
1240 << 3 << 2; |
|
1241 |
|
1242 QTest::newRow("Span, anchor row disabled") << -1 << -1 |
|
1243 << (IntList() << 2) |
|
1244 << IntList() |
|
1245 << QRect(1, 2, 2, 3) |
|
1246 << 1 << 2 << (IntList() << int(QtTestTableView::MoveDown)) |
|
1247 << 3 << 2; |
|
1248 |
|
1249 QTest::newRow("Move through span right") << -1 << -1 |
|
1250 << IntList() |
|
1251 << IntList() |
|
1252 << QRect(1, 2, 2, 3) |
|
1253 << 3 << 0 << (IntList() << int(QtTestTableView::MoveRight) << int(QtTestTableView::MoveRight)) |
|
1254 << 3 << 3; |
|
1255 |
|
1256 QTest::newRow("Move through span left") << -1 << -1 |
|
1257 << IntList() |
|
1258 << IntList() |
|
1259 << QRect(1, 2, 2, 3) |
|
1260 << 3 << 3 << (IntList() << int(QtTestTableView::MoveLeft) << int(QtTestTableView::MoveLeft)) |
|
1261 << 3 << 0; |
|
1262 |
|
1263 QTest::newRow("Move through span down") << -1 << -1 |
|
1264 << IntList() |
|
1265 << IntList() |
|
1266 << QRect(1, 2, 2, 3) |
|
1267 << 1 << 2 << (IntList() << int(QtTestTableView::MoveDown) << int(QtTestTableView::MoveDown)) |
|
1268 << 5 << 2; |
|
1269 |
|
1270 QTest::newRow("Move through span up") << -1 << -1 |
|
1271 << IntList() |
|
1272 << IntList() |
|
1273 << QRect(1, 2, 2, 3) |
|
1274 << 5 << 2 << (IntList() << int(QtTestTableView::MoveUp) << int(QtTestTableView::MoveUp)) |
|
1275 << 1 << 2; |
|
1276 |
|
1277 IntList fullList; |
|
1278 for (int i = 0; i < 7; ++i) |
|
1279 fullList << i; |
|
1280 |
|
1281 QTest::newRow("All disabled, wrap forward. Timeout => FAIL") << -1 << -1 |
|
1282 << fullList |
|
1283 << fullList |
|
1284 << QRect() |
|
1285 << 1 << 0 << (IntList() << int(QtTestTableView::MoveNext)) |
|
1286 << 1 << 0; |
|
1287 |
|
1288 QTest::newRow("All disabled, wrap backwards. Timeout => FAIL") << -1 << -1 |
|
1289 << fullList |
|
1290 << fullList |
|
1291 << QRect() |
|
1292 << 1 << 0 << (IntList() << int(QtTestTableView::MovePrevious)) |
|
1293 << 1 << 0; |
|
1294 } |
|
1295 |
|
1296 void tst_QTableView::moveCursorStrikesBack() |
|
1297 { |
|
1298 QFETCH(int, hideRow); |
|
1299 QFETCH(int, hideColumn); |
|
1300 QFETCH(IntList, disableRows); |
|
1301 QFETCH(IntList, disableColumns); |
|
1302 QFETCH(QRect, span); |
|
1303 |
|
1304 QFETCH(int, startRow); |
|
1305 QFETCH(int, startColumn); |
|
1306 QFETCH(IntList, cursorMoveActions); |
|
1307 QFETCH(int, expectedRow); |
|
1308 QFETCH(int, expectedColumn); |
|
1309 |
|
1310 QtTestTableModel model(7, 7); |
|
1311 QtTestTableView view; |
|
1312 view.setModel(&model); |
|
1313 view.hideRow(hideRow); |
|
1314 view.hideColumn(hideColumn); |
|
1315 |
|
1316 if (span.height() && span.width()) |
|
1317 view.setSpan(span.top(), span.left(), span.height(), span.width()); |
|
1318 view.show(); |
|
1319 |
|
1320 QModelIndex index = model.index(startRow, startColumn); |
|
1321 view.setCurrentIndex(index); |
|
1322 |
|
1323 foreach (int row, disableRows) |
|
1324 model.disableRow(row); |
|
1325 foreach (int column, disableColumns) |
|
1326 model.disableColumn(column); |
|
1327 |
|
1328 int newRow = -1; |
|
1329 int newColumn = -1; |
|
1330 foreach (int cursorMoveAction, cursorMoveActions) { |
|
1331 QModelIndex newIndex = view.moveCursor((QtTestTableView::CursorAction)cursorMoveAction, 0); |
|
1332 view.setCurrentIndex(newIndex); |
|
1333 newRow = newIndex.row(); |
|
1334 newColumn = newIndex.column(); |
|
1335 } |
|
1336 |
|
1337 // expected fails, task 119433 |
|
1338 if(newRow == -1) |
|
1339 return; |
|
1340 QCOMPARE(newRow, expectedRow); |
|
1341 QCOMPARE(newColumn, expectedColumn); |
|
1342 } |
|
1343 |
|
1344 void tst_QTableView::hideRows_data() |
|
1345 { |
|
1346 QTest::addColumn<int>("rowCount"); |
|
1347 QTest::addColumn<int>("columnCount"); |
|
1348 QTest::addColumn<int>("showRow"); // hide, then show |
|
1349 QTest::addColumn<int>("hideRow"); // hide only |
|
1350 QTest::addColumn<int>("row"); |
|
1351 QTest::addColumn<int>("column"); |
|
1352 QTest::addColumn<int>("rowSpan"); |
|
1353 QTest::addColumn<int>("columnSpan"); |
|
1354 |
|
1355 QTest::newRow("show row 0, hide row 3, no span") |
|
1356 << 10 << 10 |
|
1357 << 0 |
|
1358 << 3 |
|
1359 << -1 << -1 |
|
1360 << 1 << 1; |
|
1361 |
|
1362 QTest::newRow("show row 0, hide row 3, span") |
|
1363 << 10 << 10 |
|
1364 << 0 |
|
1365 << 3 |
|
1366 << 0 << 0 |
|
1367 << 3 << 2; |
|
1368 } |
|
1369 |
|
1370 void tst_QTableView::hideRows() |
|
1371 { |
|
1372 QFETCH(int, rowCount); |
|
1373 QFETCH(int, columnCount); |
|
1374 QFETCH(int, showRow); |
|
1375 QFETCH(int, hideRow); |
|
1376 QFETCH(int, row); |
|
1377 QFETCH(int, column); |
|
1378 QFETCH(int, rowSpan); |
|
1379 QFETCH(int, columnSpan); |
|
1380 |
|
1381 QtTestTableModel model(rowCount, columnCount); |
|
1382 QTableView view; |
|
1383 |
|
1384 view.setModel(&model); |
|
1385 view.setSpan(row, column, rowSpan, columnSpan); |
|
1386 |
|
1387 view.hideRow(showRow); |
|
1388 QVERIFY(view.isRowHidden(showRow)); |
|
1389 |
|
1390 view.hideRow(hideRow); |
|
1391 QVERIFY(view.isRowHidden(hideRow)); |
|
1392 |
|
1393 view.showRow(showRow); |
|
1394 QVERIFY(!view.isRowHidden(showRow)); |
|
1395 QVERIFY(view.isRowHidden(hideRow)); |
|
1396 } |
|
1397 |
|
1398 void tst_QTableView::hideColumns_data() |
|
1399 { |
|
1400 QTest::addColumn<int>("rowCount"); |
|
1401 QTest::addColumn<int>("columnCount"); |
|
1402 QTest::addColumn<int>("showColumn"); // hide, then show |
|
1403 QTest::addColumn<int>("hideColumn"); // hide only |
|
1404 QTest::addColumn<int>("row"); |
|
1405 QTest::addColumn<int>("column"); |
|
1406 QTest::addColumn<int>("rowSpan"); |
|
1407 QTest::addColumn<int>("columnSpan"); |
|
1408 |
|
1409 QTest::newRow("show col 0, hide col 3, no span") |
|
1410 << 10 << 10 |
|
1411 << 0 |
|
1412 << 3 |
|
1413 << -1 << -1 |
|
1414 << 1 << 1; |
|
1415 |
|
1416 QTest::newRow("show col 0, hide col 3, span") |
|
1417 << 10 << 10 |
|
1418 << 0 |
|
1419 << 3 |
|
1420 << 0 << 0 |
|
1421 << 3 << 2; |
|
1422 } |
|
1423 |
|
1424 void tst_QTableView::hideColumns() |
|
1425 { |
|
1426 QFETCH(int, rowCount); |
|
1427 QFETCH(int, columnCount); |
|
1428 QFETCH(int, showColumn); |
|
1429 QFETCH(int, hideColumn); |
|
1430 QFETCH(int, row); |
|
1431 QFETCH(int, column); |
|
1432 QFETCH(int, rowSpan); |
|
1433 QFETCH(int, columnSpan); |
|
1434 |
|
1435 QtTestTableModel model(rowCount, columnCount); |
|
1436 |
|
1437 QTableView view; |
|
1438 view.setModel(&model); |
|
1439 view.setSpan(row, column, rowSpan, columnSpan); |
|
1440 |
|
1441 view.hideColumn(showColumn); |
|
1442 QVERIFY(view.isColumnHidden(showColumn)); |
|
1443 |
|
1444 view.hideColumn(hideColumn); |
|
1445 QVERIFY(view.isColumnHidden(hideColumn)); |
|
1446 |
|
1447 view.showColumn(showColumn); |
|
1448 QVERIFY(!view.isColumnHidden(showColumn)); |
|
1449 QVERIFY(view.isColumnHidden(hideColumn)); |
|
1450 } |
|
1451 |
|
1452 void tst_QTableView::selection_data() |
|
1453 { |
|
1454 QTest::addColumn<int>("rowCount"); |
|
1455 QTest::addColumn<int>("columnCount"); |
|
1456 QTest::addColumn<int>("row"); |
|
1457 QTest::addColumn<int>("column"); |
|
1458 QTest::addColumn<int>("rowSpan"); |
|
1459 QTest::addColumn<int>("columnSpan"); |
|
1460 QTest::addColumn<int>("hideRow"); |
|
1461 QTest::addColumn<int>("hideColumn"); |
|
1462 QTest::addColumn<int>("moveRowFrom"); |
|
1463 QTest::addColumn<int>("moveRowTo"); |
|
1464 QTest::addColumn<int>("moveColumnFrom"); |
|
1465 QTest::addColumn<int>("moveColumnTo"); |
|
1466 QTest::addColumn<int>("rowHeight"); |
|
1467 QTest::addColumn<int>("columnWidth"); |
|
1468 QTest::addColumn<int>("x"); |
|
1469 QTest::addColumn<int>("y"); |
|
1470 QTest::addColumn<int>("width"); |
|
1471 QTest::addColumn<int>("height"); |
|
1472 QTest::addColumn<int>("command"); |
|
1473 QTest::addColumn<int>("selectedCount"); // ### make this more detailed |
|
1474 |
|
1475 QTest::newRow("no span, no hidden, no moved, 3x3 select") |
|
1476 << 10 << 10 // dim |
|
1477 << -1 << -1 // pos |
|
1478 << 1 << 1 // span |
|
1479 << -1 << -1 // hide |
|
1480 << -1 << -1 // move row |
|
1481 << -1 << -1 // move col |
|
1482 << 40 << 40 // cell size |
|
1483 << 20 << 20 << 80 << 80 // rect |
|
1484 << int(QItemSelectionModel::Select) // command |
|
1485 << 9; // selected count |
|
1486 |
|
1487 QTest::newRow("row span, no hidden, no moved, 3x3 select") |
|
1488 << 10 << 10 // dim |
|
1489 << 1 << 1 // pos |
|
1490 << 2 << 1 // span |
|
1491 << -1 << -1 // hide |
|
1492 << -1 << -1 // move row |
|
1493 << -1 << -1 // move col |
|
1494 << 40 << 40 // cell size |
|
1495 << 20 << 20 << 80 << 80 // rect |
|
1496 << int(QItemSelectionModel::Select) // command |
|
1497 << 8; // selected count |
|
1498 |
|
1499 QTest::newRow("col span, no hidden, no moved, 3x3 select") |
|
1500 << 10 << 10 // dim |
|
1501 << 1 << 1 // pos |
|
1502 << 1 << 2 // span |
|
1503 << -1 << -1 // hide |
|
1504 << -1 << -1 // move row |
|
1505 << -1 << -1 // move col |
|
1506 << 40 << 40 // cell size |
|
1507 << 20 << 20 << 80 << 80 // rect |
|
1508 << int(QItemSelectionModel::Select) // command |
|
1509 << 8; // selected count |
|
1510 |
|
1511 QTest::newRow("no span, row hidden, no moved, 3x3 select") |
|
1512 << 10 << 10 // dim |
|
1513 << -1 << -1 // pos |
|
1514 << 1 << 1 // span |
|
1515 << 1 << -1 // hide |
|
1516 << -1 << -1 // move row |
|
1517 << -1 << -1 // move col |
|
1518 << 40 << 40 // cell size |
|
1519 << 20 << 20 << 80 << 80 // rect |
|
1520 << int(QItemSelectionModel::Select) // command |
|
1521 << 9; // selected count |
|
1522 |
|
1523 QTest::newRow("no span, col hidden, no moved, 3x3 select") |
|
1524 << 10 << 10 // dim |
|
1525 << -1 << -1 // pos |
|
1526 << 1 << 1 // span |
|
1527 << -1 << 1 // hide |
|
1528 << -1 << -1 // move row |
|
1529 << -1 << -1 // move col |
|
1530 << 40 << 40 // cell size |
|
1531 << 20 << 20 << 80 << 80 // rect |
|
1532 << int(QItemSelectionModel::Select) // command |
|
1533 << 9; // selected count |
|
1534 |
|
1535 QTest::newRow("no span, no hidden, row moved, 3x3 select") |
|
1536 << 10 << 10 // dim |
|
1537 << -1 << -1 // pos |
|
1538 << 1 << 1 // span |
|
1539 << -1 << -1 // hide |
|
1540 << 1 << 3 // move row |
|
1541 << -1 << -1 // move col |
|
1542 << 40 << 40 // cell size |
|
1543 << 20 << 20 << 80 << 80 // rect |
|
1544 << int(QItemSelectionModel::Select) // command |
|
1545 << 9; // selected count |
|
1546 |
|
1547 QTest::newRow("no span, no hidden, col moved, 3x3 select") |
|
1548 << 10 << 10 // dim |
|
1549 << -1 << -1 // pos |
|
1550 << 1 << 1 // span |
|
1551 << -1 << -1 // hide |
|
1552 << -1 << -1 // move row |
|
1553 << 1 << 3 // move col |
|
1554 << 40 << 40 // cell size |
|
1555 << 20 << 20 << 80 << 80 // rect |
|
1556 << int(QItemSelectionModel::Select) // command |
|
1557 << 9; // selected count |
|
1558 } |
|
1559 |
|
1560 void tst_QTableView::selection() |
|
1561 { |
|
1562 QFETCH(int, rowCount); |
|
1563 QFETCH(int, columnCount); |
|
1564 QFETCH(int, row); |
|
1565 QFETCH(int, column); |
|
1566 QFETCH(int, rowSpan); |
|
1567 QFETCH(int, columnSpan); |
|
1568 QFETCH(int, hideRow); |
|
1569 QFETCH(int, hideColumn); |
|
1570 QFETCH(int, moveRowFrom); |
|
1571 QFETCH(int, moveRowTo); |
|
1572 QFETCH(int, moveColumnFrom); |
|
1573 QFETCH(int, moveColumnTo); |
|
1574 QFETCH(int, rowHeight); |
|
1575 QFETCH(int, columnWidth); |
|
1576 QFETCH(int, x); |
|
1577 QFETCH(int, y); |
|
1578 QFETCH(int, width); |
|
1579 QFETCH(int, height); |
|
1580 QFETCH(int, command); |
|
1581 QFETCH(int, selectedCount); |
|
1582 |
|
1583 QtTestTableModel model(rowCount, columnCount); |
|
1584 |
|
1585 QtTestTableView view; |
|
1586 view.show(); |
|
1587 view.setModel(&model); |
|
1588 |
|
1589 view.setSpan(row, column, rowSpan, columnSpan); |
|
1590 |
|
1591 view.hideRow(hideRow); |
|
1592 view.hideColumn(hideColumn); |
|
1593 |
|
1594 view.verticalHeader()->moveSection(moveRowFrom, moveRowTo); |
|
1595 view.horizontalHeader()->moveSection(moveColumnFrom, moveColumnTo); |
|
1596 |
|
1597 for (int r = 0; r < rowCount; ++r) |
|
1598 view.setRowHeight(r, rowHeight); |
|
1599 for (int c = 0; c < columnCount; ++c) |
|
1600 view.setColumnWidth(c, columnWidth); |
|
1601 |
|
1602 view.setSelection(QRect(x, y, width, height), |
|
1603 QItemSelectionModel::SelectionFlags(command)); |
|
1604 |
|
1605 QCOMPARE(view.selectedIndexes().count(), selectedCount); |
|
1606 } |
|
1607 |
|
1608 void tst_QTableView::selectRow_data() |
|
1609 { |
|
1610 QTest::addColumn<int>("rowCount"); |
|
1611 QTest::addColumn<int>("columnCount"); |
|
1612 QTest::addColumn<int>("row"); |
|
1613 QTest::addColumn<int>("mode"); |
|
1614 QTest::addColumn<int>("behavior"); |
|
1615 QTest::addColumn<int>("selectedItems"); |
|
1616 |
|
1617 QTest::newRow("SingleSelection and SelectItems") |
|
1618 << 10 << 10 |
|
1619 << 0 |
|
1620 << (int)QAbstractItemView::SingleSelection |
|
1621 << (int)QAbstractItemView::SelectItems |
|
1622 << 0; |
|
1623 |
|
1624 QTest::newRow("SingleSelection and SelectRows") |
|
1625 << 10 << 10 |
|
1626 << 0 |
|
1627 << (int)QAbstractItemView::SingleSelection |
|
1628 << (int)QAbstractItemView::SelectRows |
|
1629 << 10; |
|
1630 |
|
1631 QTest::newRow("SingleSelection and SelectColumns") |
|
1632 << 10 << 10 |
|
1633 << 0 |
|
1634 << (int)QAbstractItemView::SingleSelection |
|
1635 << (int)QAbstractItemView::SelectColumns |
|
1636 << 0; |
|
1637 |
|
1638 QTest::newRow("MultiSelection and SelectItems") |
|
1639 << 10 << 10 |
|
1640 << 0 |
|
1641 << (int)QAbstractItemView::MultiSelection |
|
1642 << (int)QAbstractItemView::SelectItems |
|
1643 << 10; |
|
1644 |
|
1645 QTest::newRow("MultiSelection and SelectRows") |
|
1646 << 10 << 10 |
|
1647 << 0 |
|
1648 << (int)QAbstractItemView::MultiSelection |
|
1649 << (int)QAbstractItemView::SelectRows |
|
1650 << 10; |
|
1651 |
|
1652 QTest::newRow("MultiSelection and SelectColumns") |
|
1653 << 10 << 10 |
|
1654 << 0 |
|
1655 << (int)QAbstractItemView::MultiSelection |
|
1656 << (int)QAbstractItemView::SelectColumns |
|
1657 << 0; |
|
1658 |
|
1659 QTest::newRow("ExtendedSelection and SelectItems") |
|
1660 << 10 << 10 |
|
1661 << 0 |
|
1662 << (int)QAbstractItemView::ExtendedSelection |
|
1663 << (int)QAbstractItemView::SelectItems |
|
1664 << 10; |
|
1665 |
|
1666 QTest::newRow("ExtendedSelection and SelectRows") |
|
1667 << 10 << 10 |
|
1668 << 0 |
|
1669 << (int)QAbstractItemView::ExtendedSelection |
|
1670 << (int)QAbstractItemView::SelectRows |
|
1671 << 10; |
|
1672 |
|
1673 QTest::newRow("ExtendedSelection and SelectColumns") |
|
1674 << 10 << 10 |
|
1675 << 0 |
|
1676 << (int)QAbstractItemView::ExtendedSelection |
|
1677 << (int)QAbstractItemView::SelectColumns |
|
1678 << 0; |
|
1679 |
|
1680 QTest::newRow("ContiguousSelection and SelectItems") |
|
1681 << 10 << 10 |
|
1682 << 0 |
|
1683 << (int)QAbstractItemView::ContiguousSelection |
|
1684 << (int)QAbstractItemView::SelectItems |
|
1685 << 10; |
|
1686 |
|
1687 QTest::newRow("ContiguousSelection and SelectRows") |
|
1688 << 10 << 10 |
|
1689 << 0 |
|
1690 << (int)QAbstractItemView::ContiguousSelection |
|
1691 << (int)QAbstractItemView::SelectRows |
|
1692 << 10; |
|
1693 |
|
1694 QTest::newRow("ContiguousSelection and SelectColumns") |
|
1695 << 10 << 10 |
|
1696 << 0 |
|
1697 << (int)QAbstractItemView::ContiguousSelection |
|
1698 << (int)QAbstractItemView::SelectColumns |
|
1699 << 0; |
|
1700 } |
|
1701 |
|
1702 void tst_QTableView::selectRow() |
|
1703 { |
|
1704 QFETCH(int, rowCount); |
|
1705 QFETCH(int, columnCount); |
|
1706 QFETCH(int, row); |
|
1707 QFETCH(int, mode); |
|
1708 QFETCH(int, behavior); |
|
1709 QFETCH(int, selectedItems); |
|
1710 |
|
1711 QtTestTableModel model(rowCount, columnCount); |
|
1712 QTableView view; |
|
1713 |
|
1714 view.setModel(&model); |
|
1715 view.setSelectionMode((QAbstractItemView::SelectionMode)mode); |
|
1716 view.setSelectionBehavior((QAbstractItemView::SelectionBehavior)behavior); |
|
1717 |
|
1718 QCOMPARE(view.selectionModel()->selectedIndexes().count(), 0); |
|
1719 |
|
1720 view.selectRow(row); |
|
1721 |
|
1722 //test we have 10 items selected |
|
1723 QCOMPARE(view.selectionModel()->selectedIndexes().count(), selectedItems); |
|
1724 //test that all 10 items are in the same row |
|
1725 for (int i = 0; selectedItems > 0 && i < rowCount; ++i) |
|
1726 QCOMPARE(view.selectionModel()->selectedIndexes().at(i).row(), row); |
|
1727 } |
|
1728 |
|
1729 void tst_QTableView::selectColumn_data() |
|
1730 { |
|
1731 QTest::addColumn<int>("rowCount"); |
|
1732 QTest::addColumn<int>("columnCount"); |
|
1733 QTest::addColumn<int>("column"); |
|
1734 QTest::addColumn<int>("mode"); |
|
1735 QTest::addColumn<int>("behavior"); |
|
1736 QTest::addColumn<int>("selectedItems"); |
|
1737 |
|
1738 QTest::newRow("SingleSelection and SelectItems") |
|
1739 << 10 << 10 |
|
1740 << 0 |
|
1741 << (int)QAbstractItemView::SingleSelection |
|
1742 << (int)QAbstractItemView::SelectItems |
|
1743 << 0; |
|
1744 |
|
1745 QTest::newRow("SingleSelection and SelectRows") |
|
1746 << 10 << 10 |
|
1747 << 0 |
|
1748 << (int)QAbstractItemView::SingleSelection |
|
1749 << (int)QAbstractItemView::SelectRows |
|
1750 << 0; |
|
1751 |
|
1752 QTest::newRow("SingleSelection and SelectColumns") |
|
1753 << 10 << 10 |
|
1754 << 0 |
|
1755 << (int)QAbstractItemView::SingleSelection |
|
1756 << (int)QAbstractItemView::SelectColumns |
|
1757 << 10; |
|
1758 |
|
1759 QTest::newRow("MultiSelection and SelectItems") |
|
1760 << 10 << 10 |
|
1761 << 0 |
|
1762 << (int)QAbstractItemView::MultiSelection |
|
1763 << (int)QAbstractItemView::SelectItems |
|
1764 << 10; |
|
1765 |
|
1766 QTest::newRow("MultiSelection and SelectRows") |
|
1767 << 10 << 10 |
|
1768 << 0 |
|
1769 << (int)QAbstractItemView::MultiSelection |
|
1770 << (int)QAbstractItemView::SelectRows |
|
1771 << 0; |
|
1772 |
|
1773 QTest::newRow("MultiSelection and SelectColumns") |
|
1774 << 10 << 10 |
|
1775 << 0 |
|
1776 << (int)QAbstractItemView::MultiSelection |
|
1777 << (int)QAbstractItemView::SelectColumns |
|
1778 << 10; |
|
1779 |
|
1780 QTest::newRow("ExtendedSelection and SelectItems") |
|
1781 << 10 << 10 |
|
1782 << 0 |
|
1783 << (int)QAbstractItemView::ExtendedSelection |
|
1784 << (int)QAbstractItemView::SelectItems |
|
1785 << 10; |
|
1786 |
|
1787 QTest::newRow("ExtendedSelection and SelectRows") |
|
1788 << 10 << 10 |
|
1789 << 0 |
|
1790 << (int)QAbstractItemView::ExtendedSelection |
|
1791 << (int)QAbstractItemView::SelectRows |
|
1792 << 0; |
|
1793 |
|
1794 QTest::newRow("ExtendedSelection and SelectColumns") |
|
1795 << 10 << 10 |
|
1796 << 0 |
|
1797 << (int)QAbstractItemView::ExtendedSelection |
|
1798 << (int)QAbstractItemView::SelectColumns |
|
1799 << 10; |
|
1800 |
|
1801 QTest::newRow("ContiguousSelection and SelectItems") |
|
1802 << 10 << 10 |
|
1803 << 0 |
|
1804 << (int)QAbstractItemView::ContiguousSelection |
|
1805 << (int)QAbstractItemView::SelectItems |
|
1806 << 10; |
|
1807 |
|
1808 QTest::newRow("ContiguousSelection and SelectRows") |
|
1809 << 10 << 10 |
|
1810 << 0 |
|
1811 << (int)QAbstractItemView::ContiguousSelection |
|
1812 << (int)QAbstractItemView::SelectRows |
|
1813 << 0; |
|
1814 |
|
1815 QTest::newRow("ContiguousSelection and SelectColumns") |
|
1816 << 10 << 10 |
|
1817 << 0 |
|
1818 << (int)QAbstractItemView::ContiguousSelection |
|
1819 << (int)QAbstractItemView::SelectColumns |
|
1820 << 10; |
|
1821 } |
|
1822 |
|
1823 void tst_QTableView::selectColumn() |
|
1824 { |
|
1825 QFETCH(int, rowCount); |
|
1826 QFETCH(int, columnCount); |
|
1827 QFETCH(int, column); |
|
1828 QFETCH(int, mode); |
|
1829 QFETCH(int, behavior); |
|
1830 QFETCH(int, selectedItems); |
|
1831 |
|
1832 QtTestTableModel model(rowCount, columnCount); |
|
1833 |
|
1834 QTableView view; |
|
1835 view.setModel(&model); |
|
1836 view.setSelectionMode((QAbstractItemView::SelectionMode)mode); |
|
1837 view.setSelectionBehavior((QAbstractItemView::SelectionBehavior)behavior); |
|
1838 |
|
1839 QCOMPARE(view.selectionModel()->selectedIndexes().count(), 0); |
|
1840 |
|
1841 view.selectColumn(column); |
|
1842 |
|
1843 QCOMPARE(view.selectionModel()->selectedIndexes().count(), selectedItems); |
|
1844 for (int i = 0; selectedItems > 0 && i < columnCount; ++i) |
|
1845 QCOMPARE(view.selectionModel()->selectedIndexes().at(i).column(), column); |
|
1846 } |
|
1847 |
|
1848 Q_DECLARE_METATYPE(QRect) |
|
1849 void tst_QTableView::visualRect_data() |
|
1850 { |
|
1851 QTest::addColumn<int>("rowCount"); |
|
1852 QTest::addColumn<int>("columnCount"); |
|
1853 QTest::addColumn<int>("hideRow"); |
|
1854 QTest::addColumn<int>("hideColumn"); |
|
1855 QTest::addColumn<int>("row"); |
|
1856 QTest::addColumn<int>("column"); |
|
1857 QTest::addColumn<int>("rowHeight"); |
|
1858 QTest::addColumn<int>("columnWidth"); |
|
1859 QTest::addColumn<QRect>("expectedRect"); |
|
1860 |
|
1861 QTest::newRow("(0,0)") |
|
1862 << 10 << 10 |
|
1863 << -1 << -1 |
|
1864 << 0 << 0 |
|
1865 << 20 << 30 |
|
1866 << QRect(0, 0, 29, 19); |
|
1867 |
|
1868 QTest::newRow("(0,0) hidden row") |
|
1869 << 10 << 10 |
|
1870 << 0 << -1 |
|
1871 << 0 << 0 |
|
1872 << 20 << 30 |
|
1873 << QRect(); |
|
1874 |
|
1875 QTest::newRow("(0,0) hidden column") |
|
1876 << 10 << 10 |
|
1877 << -1 << 0 |
|
1878 << 0 << 0 |
|
1879 << 20 << 30 |
|
1880 << QRect(); |
|
1881 |
|
1882 QTest::newRow("(0,0) hidden row and column") |
|
1883 << 10 << 10 |
|
1884 << 0 << 0 |
|
1885 << 0 << 0 |
|
1886 << 20 << 30 |
|
1887 << QRect(); |
|
1888 |
|
1889 QTest::newRow("(0,0) out of bounds") |
|
1890 << 10 << 10 |
|
1891 << -1 << -1 |
|
1892 << 20 << 20 |
|
1893 << 20 << 30 |
|
1894 << QRect(); |
|
1895 |
|
1896 QTest::newRow("(5,5), hidden row") |
|
1897 << 10 << 10 |
|
1898 << 5 << -1 |
|
1899 << 5 << 5 |
|
1900 << 20 << 30 |
|
1901 << QRect(); |
|
1902 |
|
1903 QTest::newRow("(9,9)") |
|
1904 << 10 << 10 |
|
1905 << -1 << -1 |
|
1906 << 9 << 9 |
|
1907 << 20 << 30 |
|
1908 << QRect(30*9, 20*9, 29, 19); |
|
1909 } |
|
1910 |
|
1911 void tst_QTableView::visualRect() |
|
1912 { |
|
1913 QFETCH(int, rowCount); |
|
1914 QFETCH(int, columnCount); |
|
1915 QFETCH(int, hideRow); |
|
1916 QFETCH(int, hideColumn); |
|
1917 QFETCH(int, row); |
|
1918 QFETCH(int, column); |
|
1919 QFETCH(int, rowHeight); |
|
1920 QFETCH(int, columnWidth); |
|
1921 QFETCH(QRect, expectedRect); |
|
1922 |
|
1923 QtTestTableModel model(rowCount, columnCount); |
|
1924 |
|
1925 QTableView view; |
|
1926 view.setModel(&model); |
|
1927 // Make sure that it has 1 pixel between each cell. |
|
1928 view.setGridStyle(Qt::SolidLine); |
|
1929 for (int i = 0; i < view.verticalHeader()->count(); ++i) |
|
1930 view.verticalHeader()->resizeSection(i, rowHeight); |
|
1931 for (int i = 0; i < view.horizontalHeader()->count(); ++i) |
|
1932 view.horizontalHeader()->resizeSection(i, columnWidth); |
|
1933 |
|
1934 view.hideRow(hideRow); |
|
1935 view.hideColumn(hideColumn); |
|
1936 |
|
1937 QRect rect = view.visualRect(model.index(row, column)); |
|
1938 QCOMPARE(rect, expectedRect); |
|
1939 } |
|
1940 |
|
1941 void tst_QTableView::fetchMore() |
|
1942 { |
|
1943 QtTestTableModel model(64, 64); |
|
1944 |
|
1945 model.can_fetch_more = true; |
|
1946 |
|
1947 QTableView view; |
|
1948 view.setModel(&model); |
|
1949 view.show(); |
|
1950 |
|
1951 QCOMPARE(model.fetch_more_count, 0); |
|
1952 view.verticalScrollBar()->setValue(view.verticalScrollBar()->maximum()); |
|
1953 QVERIFY(model.fetch_more_count > 0); |
|
1954 |
|
1955 model.fetch_more_count = 0; //reset |
|
1956 view.scrollToTop(); |
|
1957 QCOMPARE(model.fetch_more_count, 0); |
|
1958 |
|
1959 view.scrollToBottom(); |
|
1960 QVERIFY(model.fetch_more_count > 0); |
|
1961 |
|
1962 model.fetch_more_count = 0; //reset |
|
1963 view.scrollToTop(); |
|
1964 view.setCurrentIndex(model.index(0, 0)); |
|
1965 QCOMPARE(model.fetch_more_count, 0); |
|
1966 |
|
1967 for (int i = 0; i < 64; ++i) |
|
1968 QTest::keyClick(&view, Qt::Key_Down); |
|
1969 QCOMPARE(view.currentIndex(), model.index(63, 0)); |
|
1970 QVERIFY(model.fetch_more_count > 0); |
|
1971 } |
|
1972 |
|
1973 void tst_QTableView::setHeaders() |
|
1974 { |
|
1975 QTableView view; |
|
1976 |
|
1977 // Make sure we don't delete ourselves |
|
1978 view.setVerticalHeader(view.verticalHeader()); |
|
1979 view.verticalHeader()->count(); |
|
1980 view.setHorizontalHeader(view.horizontalHeader()); |
|
1981 view.horizontalHeader()->count(); |
|
1982 |
|
1983 // Try passing around a header without it being deleted |
|
1984 QTableView view2; |
|
1985 view2.setVerticalHeader(view.verticalHeader()); |
|
1986 view2.setHorizontalHeader(view.horizontalHeader()); |
|
1987 view.setHorizontalHeader(new QHeaderView(Qt::Horizontal)); |
|
1988 view.setVerticalHeader(new QHeaderView(Qt::Vertical)); |
|
1989 view2.verticalHeader()->count(); |
|
1990 view2.horizontalHeader()->count(); |
|
1991 |
|
1992 } |
|
1993 |
|
1994 void tst_QTableView::resizeRowsToContents_data() |
|
1995 { |
|
1996 QTest::addColumn<int>("rowCount"); |
|
1997 QTest::addColumn<int>("columnCount"); |
|
1998 QTest::addColumn<bool>("showGrid"); |
|
1999 QTest::addColumn<int>("cellWidth"); |
|
2000 QTest::addColumn<int>("cellHeight"); |
|
2001 QTest::addColumn<int>("rowHeight"); |
|
2002 QTest::addColumn<int>("columnWidth"); |
|
2003 |
|
2004 QTest::newRow("10x10 grid shown 40x40") |
|
2005 << 10 << 10 << false << 40 << 40 << 40 << 40; |
|
2006 |
|
2007 QTest::newRow("10x10 grid not shown 40x40") |
|
2008 << 10 << 10 << true << 40 << 40 << 41 << 41; |
|
2009 } |
|
2010 |
|
2011 void tst_QTableView::resizeRowsToContents() |
|
2012 { |
|
2013 QFETCH(int, rowCount); |
|
2014 QFETCH(int, columnCount); |
|
2015 QFETCH(bool, showGrid); |
|
2016 QFETCH(int, cellWidth); |
|
2017 QFETCH(int, cellHeight); |
|
2018 QFETCH(int, rowHeight); |
|
2019 QFETCH(int, columnWidth); |
|
2020 Q_UNUSED(columnWidth); |
|
2021 |
|
2022 QtTestTableModel model(rowCount, columnCount); |
|
2023 QtTestTableView view; |
|
2024 QtTestItemDelegate delegate; |
|
2025 |
|
2026 view.setModel(&model); |
|
2027 view.setItemDelegate(&delegate); |
|
2028 view.setShowGrid(showGrid); // the grid will add to the row height |
|
2029 |
|
2030 delegate.hint = QSize(cellWidth, cellHeight); |
|
2031 |
|
2032 QSignalSpy resizedSpy(view.verticalHeader(), SIGNAL(sectionResized(int, int, int))); |
|
2033 view.resizeRowsToContents(); |
|
2034 |
|
2035 QCOMPARE(resizedSpy.count(), model.rowCount()); |
|
2036 for (int r = 0; r < model.rowCount(); ++r) { |
|
2037 QCOMPARE(view.rowHeight(r), rowHeight); |
|
2038 } |
|
2039 } |
|
2040 |
|
2041 void tst_QTableView::resizeColumnsToContents_data() |
|
2042 { |
|
2043 QTest::addColumn<int>("rowCount"); |
|
2044 QTest::addColumn<int>("columnCount"); |
|
2045 QTest::addColumn<bool>("showGrid"); |
|
2046 QTest::addColumn<int>("cellWidth"); |
|
2047 QTest::addColumn<int>("cellHeight"); |
|
2048 QTest::addColumn<int>("rowHeight"); |
|
2049 QTest::addColumn<int>("columnWidth"); |
|
2050 |
|
2051 QTest::newRow("10x10 grid shown 40x40") |
|
2052 << 10 << 10 << false << 40 << 40 << 40 << 40; |
|
2053 |
|
2054 QTest::newRow("10x10 grid not shown 40x40") |
|
2055 << 10 << 10 << true << 40 << 40 << 41 << 41; |
|
2056 } |
|
2057 |
|
2058 void tst_QTableView::resizeColumnsToContents() |
|
2059 { |
|
2060 QFETCH(int, rowCount); |
|
2061 QFETCH(int, columnCount); |
|
2062 QFETCH(bool, showGrid); |
|
2063 QFETCH(int, cellWidth); |
|
2064 QFETCH(int, cellHeight); |
|
2065 QFETCH(int, rowHeight); |
|
2066 QFETCH(int, columnWidth); |
|
2067 Q_UNUSED(rowHeight); |
|
2068 |
|
2069 QtTestTableModel model(rowCount, columnCount); |
|
2070 QtTestTableView view; |
|
2071 QtTestItemDelegate delegate; |
|
2072 |
|
2073 view.setModel(&model); |
|
2074 view.setItemDelegate(&delegate); |
|
2075 view.setShowGrid(showGrid); // the grid will add to the row height |
|
2076 |
|
2077 delegate.hint = QSize(cellWidth, cellHeight); |
|
2078 |
|
2079 QSignalSpy resizedSpy(view.horizontalHeader(), SIGNAL(sectionResized(int, int, int))); |
|
2080 view.resizeColumnsToContents(); |
|
2081 |
|
2082 QCOMPARE(resizedSpy.count(), model.columnCount()); |
|
2083 for (int c = 0; c < model.columnCount(); ++c) |
|
2084 QCOMPARE(view.columnWidth(c), columnWidth); |
|
2085 } |
|
2086 |
|
2087 void tst_QTableView::rowViewportPosition_data() |
|
2088 { |
|
2089 QTest::addColumn<int>("rowCount"); |
|
2090 QTest::addColumn<int>("rowHeight"); |
|
2091 QTest::addColumn<int>("row"); |
|
2092 QTest::addColumn<int>("verticalScrollMode"); |
|
2093 QTest::addColumn<int>("verticalScrollValue"); |
|
2094 QTest::addColumn<int>("rowViewportPosition"); |
|
2095 |
|
2096 QTest::newRow("row 0, scroll per item 0") |
|
2097 << 10 << 40 << 0 << int(QAbstractItemView::ScrollPerItem) << 0 << 0; |
|
2098 |
|
2099 QTest::newRow("row 1, scroll per item, 0") |
|
2100 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerItem) << 0 << 1 * 40; |
|
2101 |
|
2102 QTest::newRow("row 1, scroll per item, 1") |
|
2103 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerItem) << 1 << 0; |
|
2104 |
|
2105 QTest::newRow("row 5, scroll per item, 0") |
|
2106 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerItem) << 0 << 5 * 40; |
|
2107 |
|
2108 QTest::newRow("row 5, scroll per item, 5") |
|
2109 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerItem) << 5 << 0; |
|
2110 |
|
2111 QTest::newRow("row 9, scroll per item, 0") |
|
2112 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerItem) << 0 << 9 * 40; |
|
2113 |
|
2114 QTest::newRow("row 9, scroll per item, 5") |
|
2115 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerItem) << 5 << 4 * 40; |
|
2116 |
|
2117 QTest::newRow("row 0, scroll per pixel 0") |
|
2118 << 10 << 40 << 0 << int(QAbstractItemView::ScrollPerPixel) << 0 << 0; |
|
2119 |
|
2120 QTest::newRow("row 1, scroll per pixel, 0") |
|
2121 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerPixel) << 0 << 1 * 40; |
|
2122 |
|
2123 QTest::newRow("row 1, scroll per pixel, 1") |
|
2124 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerPixel) << 1 * 40 << 0; |
|
2125 |
|
2126 QTest::newRow("row 5, scroll per pixel, 0") |
|
2127 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerPixel) << 0 << 5 * 40; |
|
2128 |
|
2129 QTest::newRow("row 5, scroll per pixel, 5") |
|
2130 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerPixel) << 5 * 40 << 0; |
|
2131 |
|
2132 QTest::newRow("row 9, scroll per pixel, 0") |
|
2133 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerPixel) << 0 << 9 * 40; |
|
2134 |
|
2135 QTest::newRow("row 9, scroll per pixel, 5") |
|
2136 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerPixel) << 5 * 40 << 4 * 40; |
|
2137 } |
|
2138 |
|
2139 void tst_QTableView::rowViewportPosition() |
|
2140 { |
|
2141 QFETCH(int, rowCount); |
|
2142 QFETCH(int, rowHeight); |
|
2143 QFETCH(int, row); |
|
2144 QFETCH(int, verticalScrollMode); |
|
2145 QFETCH(int, verticalScrollValue); |
|
2146 QFETCH(int, rowViewportPosition); |
|
2147 |
|
2148 QtTestTableModel model(rowCount, 1); |
|
2149 QtTestTableView view; |
|
2150 view.resize(100, 2 * rowHeight); |
|
2151 view.show(); |
|
2152 |
|
2153 view.setModel(&model); |
|
2154 for (int r = 0; r < rowCount; ++r) |
|
2155 view.setRowHeight(r, rowHeight); |
|
2156 |
|
2157 view.setVerticalScrollMode((QAbstractItemView::ScrollMode)verticalScrollMode); |
|
2158 view.verticalScrollBar()->setValue(verticalScrollValue); |
|
2159 |
|
2160 QCOMPARE(view.rowViewportPosition(row), rowViewportPosition); |
|
2161 } |
|
2162 |
|
2163 void tst_QTableView::rowAt_data() |
|
2164 { |
|
2165 QTest::addColumn<int>("rowCount"); |
|
2166 QTest::addColumn<int>("rowHeight"); |
|
2167 QTest::addColumn<IntList>("hiddenRows"); |
|
2168 QTest::addColumn<int>("coordinate"); |
|
2169 QTest::addColumn<int>("row"); |
|
2170 |
|
2171 QTest::newRow("row at 100") << 5 << 40 << IntList() << 100 << 2; |
|
2172 QTest::newRow("row at 180") << 5 << 40 << IntList() << 180 << 4; |
|
2173 QTest::newRow("row at 20") << 5 << 40 << IntList() << 20 << 0; |
|
2174 |
|
2175 // ### expand the dataset to include hidden rows |
|
2176 } |
|
2177 |
|
2178 void tst_QTableView::rowAt() |
|
2179 { |
|
2180 QFETCH(int, rowCount); |
|
2181 QFETCH(int, rowHeight); |
|
2182 QFETCH(IntList, hiddenRows); |
|
2183 QFETCH(int, coordinate); |
|
2184 QFETCH(int, row); |
|
2185 |
|
2186 QtTestTableModel model(rowCount, 1); |
|
2187 QtTestTableView view; |
|
2188 view.resize(100, 2 * rowHeight); |
|
2189 |
|
2190 view.setModel(&model); |
|
2191 |
|
2192 for (int r = 0; r < rowCount; ++r) |
|
2193 view.setRowHeight(r, rowHeight); |
|
2194 |
|
2195 for (int i = 0; i < hiddenRows.count(); ++i) |
|
2196 view.hideRow(hiddenRows.at(i)); |
|
2197 |
|
2198 QCOMPARE(view.rowAt(coordinate), row); |
|
2199 } |
|
2200 |
|
2201 void tst_QTableView::rowHeight_data() |
|
2202 { |
|
2203 QTest::addColumn<int>("rowCount"); |
|
2204 QTest::addColumn<IntList>("rowHeights"); |
|
2205 QTest::addColumn<BoolList>("hiddenRows"); |
|
2206 |
|
2207 QTest::newRow("increasing") |
|
2208 << 5 |
|
2209 << (IntList() << 20 << 30 << 40 << 50 << 60) |
|
2210 << (BoolList() << false << false << false << false << false); |
|
2211 |
|
2212 QTest::newRow("decreasing") |
|
2213 << 5 |
|
2214 << (IntList() << 60 << 50 << 40 << 30 << 20) |
|
2215 << (BoolList() << false << false << false << false << false); |
|
2216 |
|
2217 QTest::newRow("random") |
|
2218 << 5 |
|
2219 << (IntList() << 87 << 34 << 68 << 91 << 27) |
|
2220 << (BoolList() << false << false << false << false << false); |
|
2221 |
|
2222 // ### expand the dataset to include hidden rows |
|
2223 } |
|
2224 |
|
2225 void tst_QTableView::rowHeight() |
|
2226 { |
|
2227 QFETCH(int, rowCount); |
|
2228 QFETCH(IntList, rowHeights); |
|
2229 QFETCH(BoolList, hiddenRows); |
|
2230 |
|
2231 QtTestTableModel model(rowCount, 1); |
|
2232 QtTestTableView view; |
|
2233 |
|
2234 view.setModel(&model); |
|
2235 |
|
2236 for (int r = 0; r < rowCount; ++r) { |
|
2237 view.setRowHeight(r, rowHeights.at(r)); |
|
2238 view.setRowHidden(r, hiddenRows.at(r)); |
|
2239 } |
|
2240 |
|
2241 for (int r = 0; r < rowCount; ++r) { |
|
2242 if (hiddenRows.at(r)) |
|
2243 QCOMPARE(view.rowHeight(r), 0); |
|
2244 else |
|
2245 QCOMPARE(view.rowHeight(r), rowHeights.at(r)); |
|
2246 } |
|
2247 } |
|
2248 |
|
2249 void tst_QTableView::columnViewportPosition_data() |
|
2250 { |
|
2251 QTest::addColumn<int>("columnCount"); |
|
2252 QTest::addColumn<int>("columnWidth"); |
|
2253 QTest::addColumn<int>("column"); |
|
2254 QTest::addColumn<int>("horizontalScrollMode"); |
|
2255 QTest::addColumn<int>("horizontalScrollValue"); |
|
2256 QTest::addColumn<int>("columnViewportPosition"); |
|
2257 |
|
2258 QTest::newRow("column 0, scroll per item 0") |
|
2259 << 10 << 40 << 0 << int(QAbstractItemView::ScrollPerItem) << 0 << 0; |
|
2260 |
|
2261 QTest::newRow("column 1, scroll per item, 0") |
|
2262 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerItem) << 0 << 1 * 40; |
|
2263 |
|
2264 QTest::newRow("column 1, scroll per item, 1") |
|
2265 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerItem) << 1 << 0; |
|
2266 |
|
2267 QTest::newRow("column 5, scroll per item, 0") |
|
2268 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerItem) << 0 << 5 * 40; |
|
2269 |
|
2270 QTest::newRow("column 5, scroll per item, 5") |
|
2271 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerItem) << 5 << 0; |
|
2272 |
|
2273 QTest::newRow("column 9, scroll per item, 0") |
|
2274 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerItem) << 0 << 9 * 40; |
|
2275 |
|
2276 QTest::newRow("column 9, scroll per item, 5") |
|
2277 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerItem) << 5 << 4 * 40; |
|
2278 |
|
2279 QTest::newRow("column 0, scroll per pixel 0") |
|
2280 << 10 << 40 << 0 << int(QAbstractItemView::ScrollPerPixel) << 0 << 0; |
|
2281 |
|
2282 QTest::newRow("column 1, scroll per pixel 0") |
|
2283 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerPixel) << 0 << 1 * 40; |
|
2284 |
|
2285 QTest::newRow("column 1, scroll per pixel 1") |
|
2286 << 10 << 40 << 1 << int(QAbstractItemView::ScrollPerPixel) << 1 * 40 << 0; |
|
2287 |
|
2288 QTest::newRow("column 5, scroll per pixel 0") |
|
2289 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerPixel) << 0 << 5 * 40; |
|
2290 |
|
2291 QTest::newRow("column 5, scroll per pixel 5") |
|
2292 << 10 << 40 << 5 << int(QAbstractItemView::ScrollPerPixel) << 5 * 40 << 0; |
|
2293 |
|
2294 QTest::newRow("column 9, scroll per pixel 0") |
|
2295 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerPixel) << 0 << 9 * 40; |
|
2296 |
|
2297 QTest::newRow("column 9, scroll per pixel 5") |
|
2298 << 10 << 40 << 9 << int(QAbstractItemView::ScrollPerPixel) << 5 * 40 << 4 * 40; |
|
2299 } |
|
2300 |
|
2301 void tst_QTableView::columnViewportPosition() |
|
2302 { |
|
2303 QFETCH(int, columnCount); |
|
2304 QFETCH(int, columnWidth); |
|
2305 QFETCH(int, column); |
|
2306 QFETCH(int, horizontalScrollMode); |
|
2307 QFETCH(int, horizontalScrollValue); |
|
2308 QFETCH(int, columnViewportPosition); |
|
2309 |
|
2310 QtTestTableModel model(1, columnCount); |
|
2311 QtTestTableView view; |
|
2312 view.resize(2 * columnWidth, 100); |
|
2313 view.show(); |
|
2314 |
|
2315 view.setModel(&model); |
|
2316 for (int c = 0; c < columnCount; ++c) |
|
2317 view.setColumnWidth(c, columnWidth); |
|
2318 |
|
2319 view.setHorizontalScrollMode((QAbstractItemView::ScrollMode)horizontalScrollMode); |
|
2320 view.horizontalScrollBar()->setValue(horizontalScrollValue); |
|
2321 |
|
2322 QCOMPARE(view.columnViewportPosition(column), columnViewportPosition); |
|
2323 } |
|
2324 |
|
2325 void tst_QTableView::columnAt_data() |
|
2326 { |
|
2327 QTest::addColumn<int>("columnCount"); |
|
2328 QTest::addColumn<int>("columnWidth"); |
|
2329 QTest::addColumn<IntList>("hiddenColumns"); |
|
2330 QTest::addColumn<int>("coordinate"); |
|
2331 QTest::addColumn<int>("column"); |
|
2332 |
|
2333 QTest::newRow("column at 100") << 5 << 40 << IntList() << 100 << 2; |
|
2334 QTest::newRow("column at 180") << 5 << 40 << IntList() << 180 << 4; |
|
2335 QTest::newRow("column at 20") << 5 << 40 << IntList() << 20 << 0; |
|
2336 |
|
2337 // ### expand the dataset to include hidden coumns |
|
2338 } |
|
2339 |
|
2340 void tst_QTableView::columnAt() |
|
2341 { |
|
2342 QFETCH(int, columnCount); |
|
2343 QFETCH(int, columnWidth); |
|
2344 QFETCH(IntList, hiddenColumns); |
|
2345 QFETCH(int, coordinate); |
|
2346 QFETCH(int, column); |
|
2347 |
|
2348 QtTestTableModel model(1, columnCount); |
|
2349 QtTestTableView view; |
|
2350 view.resize(2 * columnWidth, 100); |
|
2351 |
|
2352 view.setModel(&model); |
|
2353 |
|
2354 for (int c = 0; c < columnCount; ++c) |
|
2355 view.setColumnWidth(c, columnWidth); |
|
2356 |
|
2357 for (int i = 0; i < hiddenColumns.count(); ++i) |
|
2358 view.hideColumn(hiddenColumns.at(i)); |
|
2359 |
|
2360 QCOMPARE(view.columnAt(coordinate), column); |
|
2361 } |
|
2362 |
|
2363 void tst_QTableView::columnWidth_data() |
|
2364 { |
|
2365 QTest::addColumn<int>("columnCount"); |
|
2366 QTest::addColumn<IntList>("columnWidths"); |
|
2367 QTest::addColumn<BoolList>("hiddenColumns"); |
|
2368 |
|
2369 QTest::newRow("increasing") |
|
2370 << 5 |
|
2371 << (IntList() << 20 << 30 << 40 << 50 << 60) |
|
2372 << (BoolList() << false << false << false << false << false); |
|
2373 |
|
2374 QTest::newRow("decreasing") |
|
2375 << 5 |
|
2376 << (IntList() << 60 << 50 << 40 << 30 << 20) |
|
2377 << (BoolList() << false << false << false << false << false); |
|
2378 |
|
2379 QTest::newRow("random") |
|
2380 << 5 |
|
2381 << (IntList() << 87 << 34 << 68 << 91 << 27) |
|
2382 << (BoolList() << false << false << false << false << false); |
|
2383 |
|
2384 // ### expand the dataset to include hidden columns |
|
2385 } |
|
2386 |
|
2387 void tst_QTableView::columnWidth() |
|
2388 { |
|
2389 QFETCH(int, columnCount); |
|
2390 QFETCH(IntList, columnWidths); |
|
2391 QFETCH(BoolList, hiddenColumns); |
|
2392 |
|
2393 QtTestTableModel model(1, columnCount); |
|
2394 QtTestTableView view; |
|
2395 |
|
2396 view.setModel(&model); |
|
2397 |
|
2398 for (int c = 0; c < columnCount; ++c) { |
|
2399 view.setColumnWidth(c, columnWidths.at(c)); |
|
2400 view.setColumnHidden(c, hiddenColumns.at(c)); |
|
2401 } |
|
2402 |
|
2403 for (int c = 0; c < columnCount; ++c) { |
|
2404 if (hiddenColumns.at(c)) |
|
2405 QCOMPARE(view.columnWidth(c), 0); |
|
2406 else |
|
2407 QCOMPARE(view.columnWidth(c), columnWidths.at(c)); |
|
2408 } |
|
2409 } |
|
2410 |
|
2411 void tst_QTableView::hiddenRow_data() |
|
2412 { |
|
2413 QTest::addColumn<int>("rowCount"); |
|
2414 QTest::addColumn<BoolList>("hiddenRows"); |
|
2415 |
|
2416 QTest::newRow("first hidden") |
|
2417 << 5 << (BoolList() << true << false << false << false << false); |
|
2418 |
|
2419 QTest::newRow("last hidden") |
|
2420 << 5 << (BoolList() << false << false << false << false << true); |
|
2421 |
|
2422 QTest::newRow("none hidden") |
|
2423 << 5 << (BoolList() << false << false << false << false << false); |
|
2424 |
|
2425 QTest::newRow("all hidden") |
|
2426 << 5 << (BoolList() << true << true << true << true << true); |
|
2427 } |
|
2428 |
|
2429 void tst_QTableView::hiddenRow() |
|
2430 { |
|
2431 QFETCH(int, rowCount); |
|
2432 QFETCH(BoolList, hiddenRows); |
|
2433 |
|
2434 |
|
2435 QtTestTableModel model(rowCount, 1); |
|
2436 QtTestTableView view; |
|
2437 |
|
2438 view.setModel(&model); |
|
2439 |
|
2440 for (int r = 0; r < rowCount; ++r) |
|
2441 QVERIFY(!view.isRowHidden(r)); |
|
2442 |
|
2443 for (int r = 0; r < rowCount; ++r) |
|
2444 view.setRowHidden(r, hiddenRows.at(r)); |
|
2445 |
|
2446 for (int r = 0; r < rowCount; ++r) |
|
2447 QCOMPARE(view.isRowHidden(r), hiddenRows.at(r)); |
|
2448 |
|
2449 for (int r = 0; r < rowCount; ++r) |
|
2450 view.setRowHidden(r, false); |
|
2451 |
|
2452 for (int r = 0; r < rowCount; ++r) |
|
2453 QVERIFY(!view.isRowHidden(r)); |
|
2454 } |
|
2455 |
|
2456 void tst_QTableView::hiddenColumn_data() |
|
2457 { |
|
2458 QTest::addColumn<int>("columnCount"); |
|
2459 QTest::addColumn<BoolList>("hiddenColumns"); |
|
2460 |
|
2461 QTest::newRow("first hidden") |
|
2462 << 5 << (BoolList() << true << false << false << false << false); |
|
2463 |
|
2464 QTest::newRow("last hidden") |
|
2465 << 5 << (BoolList() << false << false << false << false << true); |
|
2466 |
|
2467 QTest::newRow("none hidden") |
|
2468 << 5 << (BoolList() << false << false << false << false << false); |
|
2469 |
|
2470 QTest::newRow("all hidden") |
|
2471 << 5 << (BoolList() << true << true << true << true << true); |
|
2472 } |
|
2473 |
|
2474 void tst_QTableView::hiddenColumn() |
|
2475 { |
|
2476 QFETCH(int, columnCount); |
|
2477 QFETCH(BoolList, hiddenColumns); |
|
2478 |
|
2479 QtTestTableModel model(1, columnCount); |
|
2480 QtTestTableView view; |
|
2481 |
|
2482 view.setModel(&model); |
|
2483 |
|
2484 for (int c = 0; c < columnCount; ++c) |
|
2485 QVERIFY(!view.isColumnHidden(c)); |
|
2486 |
|
2487 for (int c = 0; c < columnCount; ++c) |
|
2488 view.setColumnHidden(c, hiddenColumns.at(c)); |
|
2489 |
|
2490 for (int c = 0; c < columnCount; ++c) |
|
2491 QCOMPARE(view.isColumnHidden(c), hiddenColumns.at(c)); |
|
2492 |
|
2493 for (int c = 0; c < columnCount; ++c) |
|
2494 view.setColumnHidden(c, false); |
|
2495 |
|
2496 for (int c = 0; c < columnCount; ++c) |
|
2497 QVERIFY(!view.isColumnHidden(c)); |
|
2498 } |
|
2499 |
|
2500 void tst_QTableView::sortingEnabled_data() |
|
2501 { |
|
2502 // QTest::addColumn<int>("columnCount"); |
|
2503 } |
|
2504 |
|
2505 void tst_QTableView::sortingEnabled() |
|
2506 { |
|
2507 // QFETCH(int, columnCount); |
|
2508 } |
|
2509 |
|
2510 void tst_QTableView::scrollTo_data() |
|
2511 { |
|
2512 QTest::addColumn<int>("verticalScrollMode"); |
|
2513 QTest::addColumn<int>("horizontalScrollMode"); |
|
2514 QTest::addColumn<int>("rowCount"); |
|
2515 QTest::addColumn<int>("columnCount"); |
|
2516 QTest::addColumn<int>("rowHeight"); |
|
2517 QTest::addColumn<int>("columnWidth"); |
|
2518 QTest::addColumn<int>("hiddenRow"); |
|
2519 QTest::addColumn<int>("hiddenColumn"); |
|
2520 QTest::addColumn<int>("row"); |
|
2521 QTest::addColumn<int>("column"); |
|
2522 QTest::addColumn<int>("rowSpan"); |
|
2523 QTest::addColumn<int>("columnSpan"); |
|
2524 QTest::addColumn<int>("horizontalScroll"); |
|
2525 QTest::addColumn<int>("verticalScroll"); |
|
2526 QTest::addColumn<int>("scrollHint"); |
|
2527 QTest::addColumn<int>("expectedHorizontalScroll"); |
|
2528 QTest::addColumn<int>("expectedVerticalScroll"); |
|
2529 |
|
2530 QTest::newRow("no hidden, no span, no scroll, per item") |
|
2531 << (int)QAbstractItemView::ScrollPerItem |
|
2532 << (int)QAbstractItemView::ScrollPerItem |
|
2533 << 10 << 10 // table |
|
2534 << 80 << 80 // size |
|
2535 << -1 << -1 // hide |
|
2536 << 0 << 0 // cell |
|
2537 << 1 << 1 // span |
|
2538 << 0 << 0 // scroll |
|
2539 << (int)QAbstractItemView::PositionAtTop |
|
2540 << 0 << 0; // expected |
|
2541 |
|
2542 QTest::newRow("no hidden, no span, no scroll, per pixel") |
|
2543 << (int)QAbstractItemView::ScrollPerPixel |
|
2544 << (int)QAbstractItemView::ScrollPerPixel |
|
2545 << 10 << 10 // table |
|
2546 << 80 << 80 // size |
|
2547 << -1 << -1 // hide |
|
2548 << 0 << 0 // cell |
|
2549 << 1 << 1 // span |
|
2550 << 0 << 0 // scroll |
|
2551 << (int)QAbstractItemView::PositionAtTop |
|
2552 << 0 << 0; // expected |
|
2553 |
|
2554 QTest::newRow("hidden, no span, no scroll, per item") |
|
2555 << (int)QAbstractItemView::ScrollPerItem |
|
2556 << (int)QAbstractItemView::ScrollPerItem |
|
2557 << 10 << 10 // table |
|
2558 << 80 << 80 // size |
|
2559 << 3 << 3 // hide |
|
2560 << 5 << 5 // cell |
|
2561 << 1 << 1 // span |
|
2562 << 0 << 0 // scroll |
|
2563 << (int)QAbstractItemView::PositionAtTop |
|
2564 << 4 << 4; // expected |
|
2565 } |
|
2566 |
|
2567 void tst_QTableView::scrollTo() |
|
2568 { |
|
2569 QFETCH(int, horizontalScrollMode); |
|
2570 QFETCH(int, verticalScrollMode); |
|
2571 QFETCH(int, rowCount); |
|
2572 QFETCH(int, columnCount); |
|
2573 QFETCH(int, rowHeight); |
|
2574 QFETCH(int, columnWidth); |
|
2575 QFETCH(int, hiddenRow); |
|
2576 QFETCH(int, hiddenColumn); |
|
2577 QFETCH(int, row); |
|
2578 QFETCH(int, column); |
|
2579 QFETCH(int, rowSpan); |
|
2580 QFETCH(int, columnSpan); |
|
2581 QFETCH(int, horizontalScroll); |
|
2582 QFETCH(int, verticalScroll); |
|
2583 QFETCH(int, scrollHint); |
|
2584 QFETCH(int, expectedHorizontalScroll); |
|
2585 QFETCH(int, expectedVerticalScroll); |
|
2586 |
|
2587 QtTestTableModel model(rowCount, columnCount); |
|
2588 QtTestTableView view; |
|
2589 |
|
2590 view.show(); |
|
2591 // resizing to this size will ensure that there can ONLY_BE_ONE_CELL inside the view. |
|
2592 QSize forcedSize(columnWidth * 2, rowHeight * 2); |
|
2593 view.resize(forcedSize); |
|
2594 QTest::qWaitForWindowShown(&view); |
|
2595 QTest::qWait(50); |
|
2596 QTRY_COMPARE(view.size(), forcedSize); |
|
2597 |
|
2598 view.setModel(&model); |
|
2599 view.setSpan(row, column, rowSpan, columnSpan); |
|
2600 view.hideRow(hiddenRow); |
|
2601 view.hideColumn(hiddenColumn); |
|
2602 view.setHorizontalScrollMode((QAbstractItemView::ScrollMode)horizontalScrollMode); |
|
2603 view.setVerticalScrollMode((QAbstractItemView::ScrollMode)verticalScrollMode); |
|
2604 |
|
2605 for (int r = 0; r < rowCount; ++r) |
|
2606 view.setRowHeight(r, rowHeight); |
|
2607 for (int c = 0; c < columnCount; ++c) |
|
2608 view.setColumnWidth(c, columnWidth); |
|
2609 |
|
2610 QTest::qWait(150); // ### needed to pass the test |
|
2611 view.horizontalScrollBar()->setValue(horizontalScroll); |
|
2612 view.verticalScrollBar()->setValue(verticalScroll); |
|
2613 |
|
2614 QModelIndex index = model.index(row, column); |
|
2615 QVERIFY(index.isValid()); |
|
2616 view.scrollTo(index, (QAbstractItemView::ScrollHint)scrollHint); |
|
2617 QCOMPARE(view.verticalScrollBar()->value(), expectedVerticalScroll); |
|
2618 QCOMPARE(view.horizontalScrollBar()->value(), expectedHorizontalScroll); |
|
2619 } |
|
2620 |
|
2621 void tst_QTableView::indexAt_data() |
|
2622 { |
|
2623 QTest::addColumn<int>("rowCount"); |
|
2624 QTest::addColumn<int>("columnCount"); |
|
2625 |
|
2626 QTest::addColumn<int>("rowHeight"); |
|
2627 QTest::addColumn<int>("columnWidth"); |
|
2628 |
|
2629 QTest::addColumn<int>("hiddenRow"); |
|
2630 QTest::addColumn<int>("hiddenColumn"); |
|
2631 |
|
2632 QTest::addColumn<int>("row"); |
|
2633 QTest::addColumn<int>("column"); |
|
2634 QTest::addColumn<int>("rowSpan"); |
|
2635 QTest::addColumn<int>("columnSpan"); |
|
2636 QTest::addColumn<int>("horizontalScroll"); |
|
2637 QTest::addColumn<int>("verticalScroll"); |
|
2638 QTest::addColumn<int>("x"); |
|
2639 QTest::addColumn<int>("y"); |
|
2640 QTest::addColumn<int>("expectedRow"); |
|
2641 QTest::addColumn<int>("expectedColumn"); |
|
2642 |
|
2643 QTest::newRow("no hidden, no span, no scroll, (20,20)") |
|
2644 << 10 << 10 // dim |
|
2645 << 40 << 40 // size |
|
2646 << -1 << -1 // hide |
|
2647 << -1 << -1 // pos |
|
2648 << 1 << 1 // span |
|
2649 << 0 << 0 // scroll |
|
2650 << 20 << 20 // point |
|
2651 << 0 << 0; // expected |
|
2652 |
|
2653 QTest::newRow("row hidden, no span, no scroll, at (20,20)") |
|
2654 << 10 << 10 // dim |
|
2655 << 40 << 40 // size |
|
2656 << 0 << -1 // hide |
|
2657 << -1 << -1 // pos |
|
2658 << 1 << 1 // span |
|
2659 << 0 << 0 // scroll |
|
2660 << 20 << 20 // point |
|
2661 << 1 << 0; // expected |
|
2662 |
|
2663 QTest::newRow("col hidden, no span, no scroll, at (20,20)") |
|
2664 << 10 << 10 // dim |
|
2665 << 40 << 40 // size |
|
2666 << -1 << 0 // hide |
|
2667 << -1 << -1 // pos |
|
2668 << 1 << 1 // span |
|
2669 << 0 << 0 // scroll |
|
2670 << 20 << 20 // point |
|
2671 << 0 << 1; // expected |
|
2672 |
|
2673 QTest::newRow("no hidden, row span, no scroll, at (60,20)") |
|
2674 << 10 << 10 // dim |
|
2675 << 40 << 40 // size |
|
2676 << -1 << -1 // hide |
|
2677 << 0 << 0 // pos |
|
2678 << 2 << 1 // span |
|
2679 << 0 << 0 // scroll |
|
2680 << 20 << 60 // point |
|
2681 << 0 << 0; // expected |
|
2682 |
|
2683 |
|
2684 QTest::newRow("no hidden, col span, no scroll, at (60,20)") |
|
2685 << 10 << 10 // dim |
|
2686 << 40 << 40 // size |
|
2687 << -1 << -1 // hide |
|
2688 << 0 << 0 // pos |
|
2689 << 1 << 2 // span |
|
2690 << 0 << 0 // scroll |
|
2691 << 60 << 20 // point |
|
2692 << 0 << 0; // expected |
|
2693 |
|
2694 QTest::newRow("no hidden, no span, scroll (5,0), at (20,20)") |
|
2695 << 10 << 10 // dim |
|
2696 << 40 << 40 // size |
|
2697 << -1 << -1 // hide |
|
2698 << -1 << -1 // pos |
|
2699 << 1 << 1 // span |
|
2700 << 5 << 0 // scroll |
|
2701 << 20 << 20 // point |
|
2702 << 0 << 5; // expected |
|
2703 |
|
2704 QTest::newRow("no hidden, no span, scroll (0,5), at (20,20)") |
|
2705 << 10 << 10 // dim |
|
2706 << 40 << 40 // size |
|
2707 << -1 << -1 // hide |
|
2708 << -1 << -1 // pos |
|
2709 << 1 << 1 // span |
|
2710 << 0 << 5 // scroll |
|
2711 << 20 << 20 // point |
|
2712 << 5 << 0; // expected |
|
2713 |
|
2714 QTest::newRow("no hidden, no span, scroll (5,5), at (20,20)") |
|
2715 << 10 << 10 // dim |
|
2716 << 40 << 40 // size |
|
2717 << -1 << -1 // hide |
|
2718 << -1 << -1 // pos |
|
2719 << 1 << 1 // span |
|
2720 << 5 << 5 // scroll |
|
2721 << 20 << 20 // point |
|
2722 << 5 << 5; // expected |
|
2723 } |
|
2724 |
|
2725 void tst_QTableView::indexAt() |
|
2726 { |
|
2727 QFETCH(int, rowCount); |
|
2728 QFETCH(int, columnCount); |
|
2729 QFETCH(int, rowHeight); |
|
2730 QFETCH(int, columnWidth); |
|
2731 QFETCH(int, hiddenRow); |
|
2732 QFETCH(int, hiddenColumn); |
|
2733 QFETCH(int, row); |
|
2734 QFETCH(int, column); |
|
2735 QFETCH(int, rowSpan); |
|
2736 QFETCH(int, columnSpan); |
|
2737 QFETCH(int, horizontalScroll); |
|
2738 QFETCH(int, verticalScroll); |
|
2739 QFETCH(int, x); |
|
2740 QFETCH(int, y); |
|
2741 QFETCH(int, expectedRow); |
|
2742 QFETCH(int, expectedColumn); |
|
2743 |
|
2744 QtTestTableModel model(rowCount, columnCount); |
|
2745 QtTestTableView view; |
|
2746 |
|
2747 view.show(); |
|
2748 QTest::qWaitForWindowShown(&view); |
|
2749 |
|
2750 //some styles change the scroll mode in their polish |
|
2751 view.setHorizontalScrollMode(QAbstractItemView::ScrollPerItem); |
|
2752 view.setVerticalScrollMode(QAbstractItemView::ScrollPerItem); |
|
2753 |
|
2754 view.setModel(&model); |
|
2755 view.setSpan(row, column, rowSpan, columnSpan); |
|
2756 view.hideRow(hiddenRow); |
|
2757 view.hideColumn(hiddenColumn); |
|
2758 |
|
2759 for (int r = 0; r < rowCount; ++r) |
|
2760 view.setRowHeight(r, rowHeight); |
|
2761 for (int c = 0; c < columnCount; ++c) |
|
2762 view.setColumnWidth(c, columnWidth); |
|
2763 |
|
2764 QTest::qWait(20); |
|
2765 view.horizontalScrollBar()->setValue(horizontalScroll); |
|
2766 view.verticalScrollBar()->setValue(verticalScroll); |
|
2767 QTest::qWait(20); |
|
2768 |
|
2769 QModelIndex index = view.indexAt(QPoint(x, y)); |
|
2770 QCOMPARE(index.row(), expectedRow); |
|
2771 QCOMPARE(index.column(), expectedColumn); |
|
2772 } |
|
2773 |
|
2774 void tst_QTableView::span_data() |
|
2775 { |
|
2776 QTest::addColumn<int>("rowCount"); |
|
2777 QTest::addColumn<int>("columnCount"); |
|
2778 QTest::addColumn<int>("hiddenRow"); |
|
2779 QTest::addColumn<int>("hiddenColumn"); |
|
2780 QTest::addColumn<int>("row"); |
|
2781 QTest::addColumn<int>("column"); |
|
2782 QTest::addColumn<int>("rowSpan"); |
|
2783 QTest::addColumn<int>("columnSpan"); |
|
2784 QTest::addColumn<int>("expectedRowSpan"); |
|
2785 QTest::addColumn<int>("expectedColumnSpan"); |
|
2786 QTest::addColumn<bool>("clear"); |
|
2787 |
|
2788 QTest::newRow("top left 2x2") |
|
2789 << 10 << 10 |
|
2790 << -1 << -1 |
|
2791 << 0 << 0 |
|
2792 << 2 << 2 |
|
2793 << 2 << 2 |
|
2794 << false; |
|
2795 |
|
2796 QTest::newRow("top left 1x2") |
|
2797 << 10 << 10 |
|
2798 << 3 << 3 |
|
2799 << 0 << 0 |
|
2800 << 1 << 2 |
|
2801 << 1 << 2 |
|
2802 << false; |
|
2803 |
|
2804 QTest::newRow("top left 2x1") |
|
2805 << 10 << 10 |
|
2806 << -1 << -1 |
|
2807 << 0 << 0 |
|
2808 << 2 << 1 |
|
2809 << 2 << 1 |
|
2810 << false; |
|
2811 |
|
2812 /* This makes no sens. |
|
2813 QTest::newRow("top left 2x0") |
|
2814 << 10 << 10 |
|
2815 << -1 << -1 |
|
2816 << 0 << 0 |
|
2817 << 2 << 0 |
|
2818 << 2 << 0 |
|
2819 << false; |
|
2820 |
|
2821 QTest::newRow("top left 0x2") |
|
2822 << 10 << 10 |
|
2823 << -1 << -1 |
|
2824 << 0 << 0 |
|
2825 << 0 << 2 |
|
2826 << 0 << 2 |
|
2827 << false;*/ |
|
2828 |
|
2829 QTest::newRow("invalid 2x2") |
|
2830 << 10 << 10 |
|
2831 << -1 << -1 |
|
2832 << -1 << -1 |
|
2833 << 2 << 2 |
|
2834 << 1 << 1 |
|
2835 << false; |
|
2836 |
|
2837 QTest::newRow("top left 2x2") |
|
2838 << 10 << 10 |
|
2839 << -1 << -1 |
|
2840 << 0 << 0 |
|
2841 << 2 << 2 |
|
2842 << 2 << 2 |
|
2843 << false; |
|
2844 |
|
2845 QTest::newRow("bottom right 2x2") |
|
2846 << 10 << 10 |
|
2847 << -1 << -1 |
|
2848 << 8 << 8 |
|
2849 << 2 << 2 |
|
2850 << 2 << 2 |
|
2851 << false; |
|
2852 |
|
2853 QTest::newRow("invalid span 2x2") |
|
2854 << 10 << 10 |
|
2855 << -1 << -1 |
|
2856 << 8 << 8 |
|
2857 << 2 << 2 |
|
2858 << 2 << 2 |
|
2859 << false; |
|
2860 |
|
2861 QTest::newRow("invalid span 3x3") |
|
2862 << 10 << 10 |
|
2863 << -1 << -1 |
|
2864 << 6 << 6 |
|
2865 << 3 << 3 |
|
2866 << 2 << 3 |
|
2867 << true; |
|
2868 |
|
2869 } |
|
2870 |
|
2871 void tst_QTableView::span() |
|
2872 { |
|
2873 QFETCH(int, rowCount); |
|
2874 QFETCH(int, columnCount); |
|
2875 QFETCH(int, hiddenRow); |
|
2876 QFETCH(int, hiddenColumn); |
|
2877 QFETCH(int, row); |
|
2878 QFETCH(int, column); |
|
2879 QFETCH(int, rowSpan); |
|
2880 QFETCH(int, columnSpan); |
|
2881 QFETCH(int, expectedRowSpan); |
|
2882 QFETCH(int, expectedColumnSpan); |
|
2883 QFETCH(bool, clear); |
|
2884 |
|
2885 QtTestTableModel model(rowCount, columnCount); |
|
2886 QtTestTableView view; |
|
2887 |
|
2888 view.setModel(&model); |
|
2889 view.show(); |
|
2890 |
|
2891 view.setSpan(row, column, rowSpan, columnSpan); |
|
2892 if (clear) { |
|
2893 model.removeLastRow(); |
|
2894 model.removeLastRow(); |
|
2895 view.update(); |
|
2896 } |
|
2897 |
|
2898 view.hideRow(hiddenRow); |
|
2899 view.hideColumn(hiddenColumn); |
|
2900 view.show(); |
|
2901 |
|
2902 QCOMPARE(view.rowSpan(row, column), expectedRowSpan); |
|
2903 QCOMPARE(view.columnSpan(row, column), expectedColumnSpan); |
|
2904 |
|
2905 if (hiddenRow > -1) { |
|
2906 QModelIndex hidden = model.index(hiddenRow, columnCount - 1); |
|
2907 QVERIFY(view.isIndexHidden(hidden)); |
|
2908 } |
|
2909 |
|
2910 if (hiddenColumn > -1) { |
|
2911 QModelIndex hidden = model.index(rowCount - 1, hiddenColumn); |
|
2912 QVERIFY(view.isIndexHidden(hidden)); |
|
2913 } |
|
2914 |
|
2915 view.clearSpans(); |
|
2916 QCOMPARE(view.rowSpan(row, column), 1); |
|
2917 QCOMPARE(view.columnSpan(row, column), 1); |
|
2918 |
|
2919 VERIFY_SPANS_CONSISTENCY(&view); |
|
2920 } |
|
2921 |
|
2922 typedef QVector<QRect> SpanList; |
|
2923 Q_DECLARE_METATYPE(SpanList) |
|
2924 |
|
2925 void tst_QTableView::spans_data() |
|
2926 { |
|
2927 QTest::addColumn<int>("rows"); |
|
2928 QTest::addColumn<int>("columns"); |
|
2929 QTest::addColumn<SpanList>("spans"); |
|
2930 QTest::addColumn<bool>("hideRowLastRowOfFirstSpan"); |
|
2931 QTest::addColumn<QPoint>("pos"); |
|
2932 QTest::addColumn<int>("expectedRowSpan"); |
|
2933 QTest::addColumn<int>("expectedColumnSpan"); |
|
2934 |
|
2935 QTest::newRow("1x3 span, query 3,0") |
|
2936 << 5 << 5 |
|
2937 << (SpanList() << QRect(3, 0, 1, 3)) |
|
2938 << false //no hidden row |
|
2939 << QPoint(3, 0) |
|
2940 << 1 |
|
2941 << 3; |
|
2942 |
|
2943 QTest::newRow("1x3 span, query 3,1") |
|
2944 << 5 << 5 |
|
2945 << (SpanList() << QRect(3, 0, 1, 3)) |
|
2946 << false //no hidden row |
|
2947 << QPoint(3, 1) |
|
2948 << 1 |
|
2949 << 3; |
|
2950 |
|
2951 QTest::newRow("1x3 span, query 3,2") |
|
2952 << 5 << 5 |
|
2953 << (SpanList() << QRect(3, 0, 1, 3)) |
|
2954 << false //no hidden row |
|
2955 << QPoint(3, 2) |
|
2956 << 1 |
|
2957 << 3; |
|
2958 |
|
2959 QTest::newRow("two 1x2 spans at the same column, query at 3,0") |
|
2960 << 5 << 5 |
|
2961 << (SpanList() << QRect(3, 0, 1, 2) << QRect(4, 0, 1, 2)) |
|
2962 << false //no hidden row |
|
2963 << QPoint(3, 0) |
|
2964 << 1 |
|
2965 << 2; |
|
2966 |
|
2967 QTest::newRow("two 1x2 spans at the same column, query at 4,0") |
|
2968 << 5 << 5 |
|
2969 << (SpanList() << QRect(3, 0, 1, 2) << QRect(4, 0, 1, 2)) |
|
2970 << false //no hidden row |
|
2971 << QPoint(4, 0) |
|
2972 << 1 |
|
2973 << 2; |
|
2974 |
|
2975 QTest::newRow("how to order spans (1,1)") |
|
2976 << 5 << 5 |
|
2977 << (SpanList() << QRect(1, 1, 3, 1) << QRect(1, 2, 2, 1)) |
|
2978 << false //no hidden row |
|
2979 << QPoint(1, 1) |
|
2980 << 3 |
|
2981 << 1; |
|
2982 |
|
2983 QTest::newRow("how to order spans (2,1)") |
|
2984 << 5 << 5 |
|
2985 << (SpanList() << QRect(1, 1, 3, 1) << QRect(1, 2, 2, 1)) |
|
2986 << false //no hidden row |
|
2987 << QPoint(2, 1) |
|
2988 << 3 |
|
2989 << 1; |
|
2990 |
|
2991 QTest::newRow("how to order spans (3,1)") |
|
2992 << 5 << 5 |
|
2993 << (SpanList() << QRect(1, 1, 3, 1) << QRect(1, 2, 2, 1)) |
|
2994 << false //no hidden row |
|
2995 << QPoint(3, 1) |
|
2996 << 3 |
|
2997 << 1; |
|
2998 |
|
2999 QTest::newRow("how to order spans (1,2)") |
|
3000 << 5 << 5 |
|
3001 << (SpanList() << QRect(1, 1, 3, 1) << QRect(1, 2, 2, 1)) |
|
3002 << false //no hidden row |
|
3003 << QPoint(1, 2) |
|
3004 << 2 |
|
3005 << 1; |
|
3006 |
|
3007 QTest::newRow("how to order spans (2,2)") |
|
3008 << 5 << 5 |
|
3009 << (SpanList() << QRect(1, 1, 3, 1) << QRect(1, 2, 2, 1)) |
|
3010 << false //no hidden row |
|
3011 << QPoint(2, 2) |
|
3012 << 2 |
|
3013 << 1; |
|
3014 |
|
3015 QTest::newRow("spans with hidden rows") |
|
3016 << 3 << 2 |
|
3017 << (SpanList() << QRect(0, 0, 2, 2) << QRect(2, 0, 1, 2)) |
|
3018 << true //we hide the last row of the first span |
|
3019 << QPoint(2, 0) |
|
3020 << 1 |
|
3021 << 2; |
|
3022 |
|
3023 QTest::newRow("QTBUG-6004: No failing Q_ASSERT, then it passes.") |
|
3024 << 5 << 5 |
|
3025 << (SpanList() << QRect(0, 0, 2, 2) << QRect(0, 0, 1, 1)) |
|
3026 << false |
|
3027 << QPoint(0, 0) |
|
3028 << 1 |
|
3029 << 1; |
|
3030 |
|
3031 QTest::newRow("QTBUG-6004 (follow-up): No failing Q_ASSERT, then it passes.") |
|
3032 << 10 << 10 |
|
3033 << (SpanList() << QRect(2, 2, 1, 3) << QRect(2, 2, 1, 1)) |
|
3034 << false |
|
3035 << QPoint(0, 0) |
|
3036 << 1 |
|
3037 << 1; |
|
3038 } |
|
3039 |
|
3040 void tst_QTableView::spans() |
|
3041 { |
|
3042 QFETCH(int, rows); |
|
3043 QFETCH(int, columns); |
|
3044 QFETCH(SpanList, spans); |
|
3045 QFETCH(bool, hideRowLastRowOfFirstSpan); |
|
3046 QFETCH(QPoint, pos); |
|
3047 QFETCH(int, expectedRowSpan); |
|
3048 QFETCH(int, expectedColumnSpan); |
|
3049 |
|
3050 QtTestTableModel model(rows, columns); |
|
3051 QtTestTableView view; |
|
3052 |
|
3053 view.setModel(&model); |
|
3054 view.show(); |
|
3055 |
|
3056 for (int i = 0; i < spans.count(); ++i) { |
|
3057 QRect sp = spans.at(i); |
|
3058 view.setSpan(sp.x(), sp.y(), sp.width(), sp.height()); |
|
3059 } |
|
3060 |
|
3061 if (hideRowLastRowOfFirstSpan) { |
|
3062 view.setRowHidden(spans.at(0).bottom(), true); |
|
3063 //we check that the span didn't break the visual rects of the model indexes |
|
3064 QRect first = view.visualRect( model.index(spans.at(0).top(), 0)); |
|
3065 QRect next = view.visualRect( model.index(spans.at(0).bottom() + 1, 0)); |
|
3066 QVERIFY(first.intersected(next).isEmpty()); |
|
3067 } |
|
3068 |
|
3069 QCOMPARE(view.columnSpan(pos.x(), pos.y()), expectedColumnSpan); |
|
3070 QCOMPARE(view.rowSpan(pos.x(), pos.y()), expectedRowSpan); |
|
3071 |
|
3072 VERIFY_SPANS_CONSISTENCY(&view); |
|
3073 } |
|
3074 |
|
3075 void tst_QTableView::spansAfterRowInsertion() |
|
3076 { |
|
3077 QtTestTableModel model(10, 10); |
|
3078 QtTestTableView view; |
|
3079 view.setModel(&model); |
|
3080 view.setSpan(3, 3, 3, 3); |
|
3081 view.show(); |
|
3082 QTest::qWait(50); |
|
3083 |
|
3084 // Insertion before the span only shifts the span. |
|
3085 view.model()->insertRows(0, 2); |
|
3086 QCOMPARE(view.rowSpan(3, 3), 1); |
|
3087 QCOMPARE(view.columnSpan(3, 3), 1); |
|
3088 QCOMPARE(view.rowSpan(5, 3), 3); |
|
3089 QCOMPARE(view.columnSpan(5, 3), 3); |
|
3090 |
|
3091 // Insertion happens before the given row, so it only shifts the span also. |
|
3092 view.model()->insertRows(5, 2); |
|
3093 QCOMPARE(view.rowSpan(5, 3), 1); |
|
3094 QCOMPARE(view.columnSpan(5, 3), 1); |
|
3095 QCOMPARE(view.rowSpan(7, 3), 3); |
|
3096 QCOMPARE(view.columnSpan(7, 3), 3); |
|
3097 |
|
3098 // Insertion inside the span expands it. |
|
3099 view.model()->insertRows(8, 2); |
|
3100 QCOMPARE(view.rowSpan(7, 3), 5); |
|
3101 QCOMPARE(view.columnSpan(7, 3), 3); |
|
3102 |
|
3103 // Insertion after the span does nothing to it. |
|
3104 view.model()->insertRows(12, 2); |
|
3105 QCOMPARE(view.rowSpan(7, 3), 5); |
|
3106 QCOMPARE(view.columnSpan(7, 3), 3); |
|
3107 |
|
3108 VERIFY_SPANS_CONSISTENCY(&view); |
|
3109 } |
|
3110 |
|
3111 void tst_QTableView::spansAfterColumnInsertion() |
|
3112 { |
|
3113 QtTestTableModel model(10, 10); |
|
3114 QtTestTableView view; |
|
3115 view.setModel(&model); |
|
3116 view.setSpan(3, 3, 3, 3); |
|
3117 view.show(); |
|
3118 QTest::qWait(50); |
|
3119 |
|
3120 // Insertion before the span only shifts the span. |
|
3121 view.model()->insertColumns(0, 2); |
|
3122 QCOMPARE(view.rowSpan(3, 3), 1); |
|
3123 QCOMPARE(view.columnSpan(3, 3), 1); |
|
3124 QCOMPARE(view.rowSpan(3, 5), 3); |
|
3125 QCOMPARE(view.columnSpan(3, 5), 3); |
|
3126 |
|
3127 // Insertion happens before the given column, so it only shifts the span also. |
|
3128 view.model()->insertColumns(5, 2); |
|
3129 QCOMPARE(view.rowSpan(3, 5), 1); |
|
3130 QCOMPARE(view.columnSpan(3, 5), 1); |
|
3131 QCOMPARE(view.rowSpan(3, 7), 3); |
|
3132 QCOMPARE(view.columnSpan(3, 7), 3); |
|
3133 |
|
3134 // Insertion inside the span expands it. |
|
3135 view.model()->insertColumns(8, 2); |
|
3136 QCOMPARE(view.rowSpan(3, 7), 3); |
|
3137 QCOMPARE(view.columnSpan(3, 7), 5); |
|
3138 |
|
3139 // Insertion after the span does nothing to it. |
|
3140 view.model()->insertColumns(12, 2); |
|
3141 QCOMPARE(view.rowSpan(3, 7), 3); |
|
3142 QCOMPARE(view.columnSpan(3, 7), 5); |
|
3143 |
|
3144 VERIFY_SPANS_CONSISTENCY(&view); |
|
3145 } |
|
3146 |
|
3147 void tst_QTableView::spansAfterRowRemoval() |
|
3148 { |
|
3149 QtTestTableModel model(10, 10); |
|
3150 QtTestTableView view; |
|
3151 view.setModel(&model); |
|
3152 |
|
3153 QList<QRect> spans; |
|
3154 spans << QRect(0, 1, 1, 2) |
|
3155 << QRect(1, 2, 1, 2) |
|
3156 << QRect(2, 2, 1, 5) |
|
3157 << QRect(2, 8, 1, 2) |
|
3158 << QRect(3, 4, 1, 2) |
|
3159 << QRect(4, 4, 1, 4) |
|
3160 << QRect(5, 6, 1, 3) |
|
3161 << QRect(6, 7, 1, 3); |
|
3162 foreach (QRect span, spans) |
|
3163 view.setSpan(span.top(), span.left(), span.height(), span.width()); |
|
3164 |
|
3165 view.show(); |
|
3166 QTest::qWait(100); |
|
3167 view.model()->removeRows(3, 3); |
|
3168 |
|
3169 QList<QRect> expectedSpans; |
|
3170 expectedSpans << QRect(0, 1, 1, 2) |
|
3171 << QRect(1, 2, 1, 1) |
|
3172 << QRect(2, 2, 1, 2) |
|
3173 << QRect(2, 5, 1, 2) |
|
3174 << QRect(3, 4, 1, 1) |
|
3175 << QRect(4, 3, 1, 2) |
|
3176 << QRect(5, 3, 1, 3) |
|
3177 << QRect(6, 4, 1, 3); |
|
3178 foreach (QRect span, expectedSpans) { |
|
3179 QCOMPARE(view.columnSpan(span.top(), span.left()), span.width()); |
|
3180 QCOMPARE(view.rowSpan(span.top(), span.left()), span.height()); |
|
3181 } |
|
3182 |
|
3183 VERIFY_SPANS_CONSISTENCY(&view); |
|
3184 } |
|
3185 |
|
3186 void tst_QTableView::spansAfterColumnRemoval() |
|
3187 { |
|
3188 QtTestTableModel model(10, 10); |
|
3189 QtTestTableView view; |
|
3190 view.setModel(&model); |
|
3191 |
|
3192 // Same set as above just swapping columns and rows. |
|
3193 QList<QRect> spans; |
|
3194 spans << QRect(0, 1, 1, 2) |
|
3195 << QRect(1, 2, 1, 2) |
|
3196 << QRect(2, 2, 1, 5) |
|
3197 << QRect(2, 8, 1, 2) |
|
3198 << QRect(3, 4, 1, 2) |
|
3199 << QRect(4, 4, 1, 4) |
|
3200 << QRect(5, 6, 1, 3) |
|
3201 << QRect(6, 7, 1, 3); |
|
3202 foreach (QRect span, spans) |
|
3203 view.setSpan(span.left(), span.top(), span.width(), span.height()); |
|
3204 |
|
3205 view.show(); |
|
3206 QTest::qWait(100); |
|
3207 view.model()->removeColumns(3, 3); |
|
3208 |
|
3209 QList<QRect> expectedSpans; |
|
3210 expectedSpans << QRect(0, 1, 1, 2) |
|
3211 << QRect(1, 2, 1, 1) |
|
3212 << QRect(2, 2, 1, 2) |
|
3213 << QRect(2, 5, 1, 2) |
|
3214 << QRect(3, 4, 1, 1) |
|
3215 << QRect(4, 3, 1, 2) |
|
3216 << QRect(5, 3, 1, 3) |
|
3217 << QRect(6, 4, 1, 3); |
|
3218 foreach (QRect span, expectedSpans) { |
|
3219 QCOMPARE(view.columnSpan(span.left(), span.top()), span.height()); |
|
3220 QCOMPARE(view.rowSpan(span.left(), span.top()), span.width()); |
|
3221 } |
|
3222 |
|
3223 VERIFY_SPANS_CONSISTENCY(&view); |
|
3224 } |
|
3225 |
|
3226 class Model : public QAbstractTableModel { |
|
3227 |
|
3228 Q_OBJECT |
|
3229 |
|
3230 public: |
|
3231 Model(QObject * parent = 0) : QAbstractTableModel(parent) { |
|
3232 } |
|
3233 |
|
3234 int rowCount(const QModelIndex &) const { |
|
3235 return rows; |
|
3236 } |
|
3237 int columnCount(const QModelIndex &) const { |
|
3238 return columns; |
|
3239 } |
|
3240 QVariant data(const QModelIndex &, int) const |
|
3241 { |
|
3242 return QVariant(); |
|
3243 } |
|
3244 void res() { reset(); } |
|
3245 |
|
3246 int rows; |
|
3247 int columns; |
|
3248 }; |
|
3249 |
|
3250 void tst_QTableView::checkHeaderReset() |
|
3251 { |
|
3252 QTableView view; |
|
3253 Model m; |
|
3254 m.rows = 3; |
|
3255 m.columns = 3; |
|
3256 view.setModel(&m); |
|
3257 |
|
3258 m.rows = 4; |
|
3259 m.columns = 4; |
|
3260 m.res(); |
|
3261 QCOMPARE(view.horizontalHeader()->count(), 4); |
|
3262 } |
|
3263 |
|
3264 void tst_QTableView::checkHeaderMinSize() |
|
3265 { |
|
3266 //tests if the minimumsize is of a header is taken into account |
|
3267 //while computing QTableView geometry. For that we test the position of the |
|
3268 //viewport. |
|
3269 QTableView view; |
|
3270 QStringListModel m; |
|
3271 m.setStringList( QStringList() << QLatin1String("one cell is enough")); |
|
3272 view.setModel(&m); |
|
3273 |
|
3274 //setting the minimum height on the horizontal header |
|
3275 //and the minimum width on the vertical header |
|
3276 view.horizontalHeader()->setMinimumHeight(50); |
|
3277 view.verticalHeader()->setMinimumWidth(100); |
|
3278 |
|
3279 view.show(); |
|
3280 |
|
3281 QVERIFY( view.verticalHeader()->y() >= view.horizontalHeader()->minimumHeight()); |
|
3282 QVERIFY( view.horizontalHeader()->x() >= view.verticalHeader()->minimumWidth()); |
|
3283 } |
|
3284 |
|
3285 void tst_QTableView::resizeToContents() |
|
3286 { |
|
3287 //checks that the resize to contents is consistent |
|
3288 QTableWidget table(2,3); |
|
3289 QTableWidget table2(2,3); |
|
3290 QTableWidget table3(2,3); |
|
3291 |
|
3292 |
|
3293 table.setHorizontalHeaderItem(0, new QTableWidgetItem("A Lot of text here: BLA BLA BLA")); |
|
3294 table2.setHorizontalHeaderItem(0, new QTableWidgetItem("A Lot of text here: BLA BLA BLA")); |
|
3295 table3.setHorizontalHeaderItem(0, new QTableWidgetItem("A Lot of text here: BLA BLA BLA")); |
|
3296 table.horizontalHeader()->setVisible(false); |
|
3297 table2.horizontalHeader()->setVisible(false); |
|
3298 table.verticalHeader()->setVisible(false); |
|
3299 table2.verticalHeader()->setVisible(false); |
|
3300 |
|
3301 |
|
3302 for(int i = 0;i<table.columnCount();i++) { |
|
3303 table.resizeColumnToContents(i); |
|
3304 } |
|
3305 for(int i = 0;i<table.rowCount();i++) { |
|
3306 table.resizeRowToContents(i); |
|
3307 } |
|
3308 table2.resizeColumnsToContents(); |
|
3309 table2.resizeRowsToContents(); |
|
3310 table3.resizeColumnsToContents(); |
|
3311 table3.resizeRowsToContents(); |
|
3312 |
|
3313 //now let's check the row/col sizes |
|
3314 for(int i = 0;i<table.columnCount();i++) { |
|
3315 QCOMPARE( table.columnWidth(i), table2.columnWidth(i)); |
|
3316 QCOMPARE( table2.columnWidth(i), table3.columnWidth(i)); |
|
3317 } |
|
3318 for(int i = 0;i<table.rowCount();i++) { |
|
3319 QCOMPARE( table.rowHeight(i), table2.rowHeight(i)); |
|
3320 QCOMPARE( table2.rowHeight(i), table3.rowHeight(i)); |
|
3321 } |
|
3322 |
|
3323 } |
|
3324 |
|
3325 QT_BEGIN_NAMESPACE |
|
3326 extern bool Q_GUI_EXPORT qt_tab_all_widgets; // qapplication.cpp |
|
3327 QT_END_NAMESPACE |
|
3328 |
|
3329 void tst_QTableView::tabFocus() |
|
3330 { |
|
3331 if (!qt_tab_all_widgets) |
|
3332 QSKIP("This test requires full keyboard control to be enabled.", SkipAll); |
|
3333 |
|
3334 // QTableView enables tabKeyNavigation by default, but you should be able |
|
3335 // to change focus on an empty table view, or on a table view that doesn't |
|
3336 // have this property set. |
|
3337 QWidget window; |
|
3338 |
|
3339 QTableView *view = new QTableView(&window); |
|
3340 QLineEdit *edit = new QLineEdit(&window); |
|
3341 |
|
3342 window.show(); |
|
3343 QApplication::setActiveWindow(&window); |
|
3344 QTest::qWaitForWindowShown(&window); |
|
3345 window.setFocus(); |
|
3346 QTest::qWait(100); |
|
3347 window.activateWindow(); |
|
3348 QTest::qWait(100); |
|
3349 |
|
3350 qApp->processEvents(); |
|
3351 |
|
3352 WAIT_FOR_CONDITION(window.hasFocus(), true); |
|
3353 |
|
3354 qApp->processEvents(); |
|
3355 |
|
3356 // window |
|
3357 QVERIFY(window.hasFocus()); |
|
3358 QVERIFY(!view->hasFocus()); |
|
3359 QVERIFY(!edit->hasFocus()); |
|
3360 |
|
3361 for (int i = 0; i < 2; ++i) { |
|
3362 // tab to view |
|
3363 QTest::keyPress(qApp->focusWidget(), Qt::Key_Tab); |
|
3364 QTRY_VERIFY(!window.hasFocus()); |
|
3365 QVERIFY(view->hasFocus()); |
|
3366 QVERIFY(!edit->hasFocus()); |
|
3367 |
|
3368 // tab to edit |
|
3369 QTest::keyPress(qApp->focusWidget(), Qt::Key_Tab); |
|
3370 QTRY_VERIFY(edit->hasFocus()); |
|
3371 QVERIFY(!window.hasFocus()); |
|
3372 QVERIFY(!view->hasFocus()); |
|
3373 } |
|
3374 |
|
3375 // backtab to view |
|
3376 QTest::keyPress(qApp->focusWidget(), Qt::Key_Backtab); |
|
3377 QTRY_VERIFY(view->hasFocus()); |
|
3378 QVERIFY(!window.hasFocus()); |
|
3379 QVERIFY(!edit->hasFocus()); |
|
3380 |
|
3381 // backtab to edit |
|
3382 QTest::keyPress(qApp->focusWidget(), Qt::Key_Backtab); |
|
3383 QTRY_VERIFY(edit->hasFocus()); |
|
3384 QVERIFY(!window.hasFocus()); |
|
3385 QVERIFY(!view->hasFocus()); |
|
3386 |
|
3387 QStandardItemModel *model = new QStandardItemModel; |
|
3388 view->setModel(model); |
|
3389 |
|
3390 // backtab to view |
|
3391 QTest::keyPress(qApp->focusWidget(), Qt::Key_Backtab); |
|
3392 QTRY_VERIFY(view->hasFocus()); |
|
3393 QVERIFY(!window.hasFocus()); |
|
3394 QVERIFY(!edit->hasFocus()); |
|
3395 |
|
3396 // backtab to edit |
|
3397 QTest::keyPress(qApp->focusWidget(), Qt::Key_Backtab); |
|
3398 QTRY_VERIFY(edit->hasFocus()); |
|
3399 QVERIFY(!window.hasFocus()); |
|
3400 QVERIFY(!view->hasFocus()); |
|
3401 |
|
3402 model->insertRow(0, new QStandardItem("Hei")); |
|
3403 model->insertRow(0, new QStandardItem("Hei")); |
|
3404 model->insertRow(0, new QStandardItem("Hei")); |
|
3405 |
|
3406 // backtab to view |
|
3407 QTest::keyPress(qApp->focusWidget(), Qt::Key_Backtab); |
|
3408 QTRY_VERIFY(view->hasFocus()); |
|
3409 QVERIFY(!window.hasFocus()); |
|
3410 QVERIFY(!edit->hasFocus()); |
|
3411 |
|
3412 // backtab to edit doesn't work |
|
3413 QTest::keyPress(qApp->focusWidget(), Qt::Key_Backtab); |
|
3414 QVERIFY(!window.hasFocus()); |
|
3415 QVERIFY(view->hasFocus()); |
|
3416 QVERIFY(!edit->hasFocus()); |
|
3417 |
|
3418 view->setTabKeyNavigation(false); |
|
3419 |
|
3420 // backtab to edit |
|
3421 QTest::keyPress(qApp->focusWidget(), Qt::Key_Backtab); |
|
3422 QTRY_VERIFY(edit->hasFocus()); |
|
3423 QVERIFY(!window.hasFocus()); |
|
3424 QVERIFY(!view->hasFocus()); |
|
3425 |
|
3426 QTest::keyPress(qApp->focusWidget(), Qt::Key_Tab); |
|
3427 QTRY_VERIFY(view->hasFocus()); |
|
3428 QTest::keyPress(qApp->focusWidget(), Qt::Key_Tab); |
|
3429 QTRY_VERIFY(edit->hasFocus()); |
|
3430 |
|
3431 delete model; |
|
3432 } |
|
3433 |
|
3434 class BigModel : public QAbstractTableModel |
|
3435 { |
|
3436 Q_OBJECT |
|
3437 public: |
|
3438 virtual QVariant data(const QModelIndex &index, |
|
3439 int role = Qt::DisplayRole) const |
|
3440 { |
|
3441 if (role == Qt::DisplayRole) |
|
3442 return QString("%1 - %2").arg(index.column()).arg(index.row()); |
|
3443 return QVariant(); |
|
3444 } |
|
3445 |
|
3446 |
|
3447 int rowCount(const QModelIndex & parent = QModelIndex()) const |
|
3448 { |
|
3449 Q_UNUSED(parent); |
|
3450 return 10000000; |
|
3451 } |
|
3452 |
|
3453 int columnCount(const QModelIndex & parent = QModelIndex()) const |
|
3454 { |
|
3455 Q_UNUSED(parent); |
|
3456 return 20000000; |
|
3457 } |
|
3458 }; |
|
3459 |
|
3460 void tst_QTableView::bigModel() |
|
3461 { |
|
3462 //should not crash |
|
3463 QTableView view; |
|
3464 BigModel model; |
|
3465 view.setModel(&model); |
|
3466 view.show(); |
|
3467 view.setSpan(10002,10002,6,6); |
|
3468 QTest::qWait(100); |
|
3469 view.resize(1000,1000); |
|
3470 QTest::qWait(100); |
|
3471 view.scrollTo(model.index(10010,10010)); |
|
3472 QTest::qWait(100); |
|
3473 } |
|
3474 |
|
3475 void tst_QTableView::selectionSignal() |
|
3476 { |
|
3477 QtTestTableModel model(10, 10); |
|
3478 QtTestTableView view; |
|
3479 view.checkSignalOrder = true; |
|
3480 view.setModel(&model); |
|
3481 view.resize(200, 200); |
|
3482 view.show(); |
|
3483 QTest::qWaitForWindowShown(&view); |
|
3484 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.visualRect(model.index(2, 0)).center()); |
|
3485 } |
|
3486 |
|
3487 class task173773_EventFilter : public QObject |
|
3488 { |
|
3489 int paintEventCount_; |
|
3490 public: |
|
3491 task173773_EventFilter() : paintEventCount_(0) {} |
|
3492 int paintEventCount() const { return paintEventCount_; } |
|
3493 private: |
|
3494 bool eventFilter(QObject *obj, QEvent *e) |
|
3495 { |
|
3496 Q_UNUSED(obj); |
|
3497 if (e->type() == QEvent::Paint) |
|
3498 ++paintEventCount_; |
|
3499 return false; |
|
3500 } |
|
3501 }; |
|
3502 |
|
3503 void tst_QTableView::task173773_updateVerticalHeader() |
|
3504 { |
|
3505 QStandardItemModel model(2, 1); |
|
3506 model.setData(model.index(0, 0), 0); |
|
3507 model.setData(model.index(1, 0), 1); |
|
3508 |
|
3509 QSortFilterProxyModel proxyModel; |
|
3510 proxyModel.setSourceModel(&model); |
|
3511 |
|
3512 QTableView view; |
|
3513 view.setModel(&proxyModel); |
|
3514 view.setSortingEnabled(true); |
|
3515 view.show(); |
|
3516 QTest::qWaitForWindowShown(&view); |
|
3517 |
|
3518 view.sortByColumn(0, Qt::AscendingOrder); |
|
3519 QTest::qWait(100); |
|
3520 |
|
3521 task173773_EventFilter eventFilter; |
|
3522 view.verticalHeader()->viewport()->installEventFilter(&eventFilter); |
|
3523 |
|
3524 view.sortByColumn(0, Qt::DescendingOrder); |
|
3525 QTest::qWait(100); |
|
3526 |
|
3527 // ### note: this test may occasionally pass even if the bug is present! |
|
3528 QVERIFY(eventFilter.paintEventCount() > 0); |
|
3529 } |
|
3530 |
|
3531 void tst_QTableView::task227953_setRootIndex() |
|
3532 { |
|
3533 QTableView tableView; |
|
3534 |
|
3535 //model = tree with two items with tables as children |
|
3536 QStandardItemModel model; |
|
3537 QStandardItem item1, item2; |
|
3538 model.appendColumn(QList<QStandardItem*>() << &item1 << &item2); |
|
3539 |
|
3540 |
|
3541 //setup the first table as a child of the first item |
|
3542 for ( int row = 0; row < 40; ++row ) { |
|
3543 item1.appendRow(QList<QStandardItem*>() << new QStandardItem(QString("row %0").arg(row))); |
|
3544 } |
|
3545 |
|
3546 //setup the second table as a child of the second item |
|
3547 for ( int row = 0; row < 10; ++row ) { |
|
3548 item2.appendRow(QList<QStandardItem*>() << new QStandardItem(QString("row %0").arg(row))); |
|
3549 } |
|
3550 |
|
3551 tableView.setModel(&model); |
|
3552 |
|
3553 //show the first 10 rows of the first table |
|
3554 QModelIndex root = model.indexFromItem(&item1); |
|
3555 tableView.setRootIndex(root); |
|
3556 for (int i = 10; i != 40; ++i) { |
|
3557 tableView.setRowHidden(i, true); |
|
3558 } |
|
3559 |
|
3560 QCOMPARE(tableView.verticalHeader()->count(), 40); |
|
3561 QCOMPARE(tableView.verticalHeader()->hiddenSectionCount(), 30); |
|
3562 |
|
3563 //show the first 10 rows of the second table |
|
3564 tableView.setRootIndex(model.indexFromItem(&item2)); |
|
3565 |
|
3566 QCOMPARE(tableView.verticalHeader()->count(), 10); |
|
3567 QCOMPARE(tableView.verticalHeader()->hiddenSectionCount(), 0); |
|
3568 QVERIFY(!tableView.verticalHeader()->isHidden()); |
|
3569 } |
|
3570 |
|
3571 void tst_QTableView::task240266_veryBigColumn() |
|
3572 { |
|
3573 QTableView table; |
|
3574 table.setFixedSize(500, 300); //just to make sure we have the 2 first columns visible |
|
3575 QStandardItemModel model(1, 3); |
|
3576 table.setModel(&model); |
|
3577 table.setColumnWidth(0, 100); //normal column |
|
3578 table.setColumnWidth(1, 100); //normal column |
|
3579 table.setColumnWidth(2, 9000); //very big column |
|
3580 table.show(); |
|
3581 QTest::qWaitForWindowShown(&table); |
|
3582 |
|
3583 //some styles change the scroll mode in their polish |
|
3584 table.setHorizontalScrollMode(QAbstractItemView::ScrollPerItem); |
|
3585 table.setVerticalScrollMode(QAbstractItemView::ScrollPerItem); |
|
3586 |
|
3587 QScrollBar *scroll = table.horizontalScrollBar(); |
|
3588 QCOMPARE(scroll->minimum(), 0); |
|
3589 QCOMPARE(scroll->maximum(), model.columnCount() - 1); |
|
3590 QCOMPARE(scroll->singleStep(), 1); |
|
3591 |
|
3592 //1 is not always a very correct value for pageStep. Ideally this should be dynamic. |
|
3593 //Maybe something for Qt 5 ;-) |
|
3594 QCOMPARE(scroll->pageStep(), 1); |
|
3595 |
|
3596 } |
|
3597 |
|
3598 void tst_QTableView::task248688_autoScrollNavigation() |
|
3599 { |
|
3600 //we make sure that when navigating with the keyboard the view is correctly scrolled |
|
3601 //to the current item |
|
3602 QStandardItemModel model(16, 16); |
|
3603 QTableView view; |
|
3604 view.setModel(&model); |
|
3605 |
|
3606 view.hideColumn(8); |
|
3607 view.hideRow(8); |
|
3608 view.show(); |
|
3609 for (int r = 0; r < model.rowCount(); ++r) { |
|
3610 if (view.isRowHidden(r)) |
|
3611 continue; |
|
3612 for (int c = 0; c < model.columnCount(); ++c) { |
|
3613 if (view.isColumnHidden(c)) |
|
3614 continue; |
|
3615 QModelIndex index = model.index(r, c); |
|
3616 view.setCurrentIndex(index); |
|
3617 QVERIFY(view.viewport()->rect().contains(view.visualRect(index))); |
|
3618 } |
|
3619 } |
|
3620 } |
|
3621 |
|
3622 |
|
3623 void tst_QTableView::mouseWheel_data() |
|
3624 { |
|
3625 QTest::addColumn<int>("scrollMode"); |
|
3626 QTest::addColumn<int>("delta"); |
|
3627 QTest::addColumn<int>("horizontalPositon"); |
|
3628 QTest::addColumn<int>("verticalPosition"); |
|
3629 |
|
3630 QTest::newRow("scroll up per item") |
|
3631 << int(QAbstractItemView::ScrollPerItem) << 120 |
|
3632 << 10 - qApp->wheelScrollLines() << 10 - qApp->wheelScrollLines(); |
|
3633 QTest::newRow("scroll down per item") |
|
3634 << int(QAbstractItemView::ScrollPerItem) << -120 |
|
3635 << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines(); |
|
3636 QTest::newRow("scroll down per pixel") |
|
3637 << int(QAbstractItemView::ScrollPerPixel) << -120 |
|
3638 << 10 + qApp->wheelScrollLines() * 89 << 10 + qApp->wheelScrollLines() * 28; |
|
3639 } |
|
3640 |
|
3641 void tst_QTableView::mouseWheel() |
|
3642 { |
|
3643 #ifdef Q_OS_WINCE |
|
3644 QSKIP("Since different Windows CE versions sport different taskbars, we skip this test", SkipAll); |
|
3645 #endif |
|
3646 QFETCH(int, scrollMode); |
|
3647 QFETCH(int, delta); |
|
3648 QFETCH(int, horizontalPositon); |
|
3649 QFETCH(int, verticalPosition); |
|
3650 |
|
3651 QtTestTableModel model(100, 100); |
|
3652 QtTestTableView view; |
|
3653 view.resize(500, 500); |
|
3654 for (int r = 0; r < 100; ++r) |
|
3655 view.setRowHeight(r, 50); |
|
3656 for (int c = 0; c < 100; ++c) |
|
3657 view.setColumnWidth(c, 100); |
|
3658 view.show(); |
|
3659 QTest::qWaitForWindowShown(&view); |
|
3660 |
|
3661 view.setModel(&model); |
|
3662 |
|
3663 view.setHorizontalScrollMode((QAbstractItemView::ScrollMode)scrollMode); |
|
3664 view.setVerticalScrollMode((QAbstractItemView::ScrollMode)scrollMode); |
|
3665 view.horizontalScrollBar()->setValue(10); |
|
3666 view.verticalScrollBar()->setValue(10); |
|
3667 |
|
3668 QPoint pos = view.viewport()->geometry().center(); |
|
3669 QWheelEvent verticalEvent(pos, delta, 0, 0, Qt::Vertical); |
|
3670 QWheelEvent horizontalEvent(pos, delta, 0, 0, Qt::Horizontal); |
|
3671 QApplication::sendEvent(view.viewport(), &horizontalEvent); |
|
3672 QVERIFY(qAbs(view.horizontalScrollBar()->value() - horizontalPositon) < 10); |
|
3673 QApplication::sendEvent(view.viewport(), &verticalEvent); |
|
3674 QVERIFY(qAbs(view.verticalScrollBar()->value() - verticalPosition) < 10); |
|
3675 } |
|
3676 |
|
3677 void tst_QTableView::addColumnWhileEditing() |
|
3678 { |
|
3679 QTableView view; |
|
3680 QStandardItemModel model(1, 10); |
|
3681 view.setModel(&model); |
|
3682 QModelIndex last = model.index(0,9); |
|
3683 view.show(); |
|
3684 |
|
3685 view.openPersistentEditor(last); |
|
3686 view.scrollTo(last); |
|
3687 |
|
3688 //let's see if the editor is moved to the right location |
|
3689 //after adding a column |
|
3690 model.setColumnCount(model.columnCount() + 1); |
|
3691 QPointer<QLineEdit> editor = qFindChild<QLineEdit*>(&view); |
|
3692 QVERIFY(editor); |
|
3693 QCOMPARE(editor->geometry(), view.visualRect(last)); |
|
3694 |
|
3695 //let's see if the editor is moved to the right location |
|
3696 //after removing a column |
|
3697 view.scrollTo(model.index(0, model.columnCount()-1)); |
|
3698 model.setColumnCount(model.columnCount() - 1); |
|
3699 QVERIFY(editor); |
|
3700 QCOMPARE(editor->geometry(), view.visualRect(last)); |
|
3701 } |
|
3702 |
|
3703 void tst_QTableView::task259308_scrollVerticalHeaderSwappedSections() |
|
3704 { |
|
3705 QStandardItemModel model; |
|
3706 model.setRowCount(50); |
|
3707 model.setColumnCount(2); |
|
3708 for (int row = 0; row < model.rowCount(); ++row) |
|
3709 for (int col = 0; col < model.columnCount(); ++col) { |
|
3710 const QModelIndex &idx = model.index(row, col); |
|
3711 model.setData(idx, QVariant(row), Qt::EditRole); |
|
3712 } |
|
3713 |
|
3714 QTableView tv; |
|
3715 tv.setModel(&model); |
|
3716 tv.show(); |
|
3717 tv.verticalHeader()->swapSections(0, model.rowCount() - 1); |
|
3718 tv.setCurrentIndex(model.index(model.rowCount() - 1, 0)); |
|
3719 |
|
3720 QTest::qWaitForWindowShown(&tv); |
|
3721 QTest::keyClick(&tv, Qt::Key_PageUp); // PageUp won't scroll when at top |
|
3722 QTRY_COMPARE(tv.rowAt(0), tv.verticalHeader()->logicalIndex(0)); |
|
3723 |
|
3724 int newRow = tv.rowAt(tv.viewport()->height()); |
|
3725 if (newRow == tv.rowAt(tv.viewport()->height() - 1)) // Overlapping row |
|
3726 newRow++; |
|
3727 QTest::keyClick(&tv, Qt::Key_PageDown); // Scroll down and check current |
|
3728 QTRY_COMPARE(tv.currentIndex().row(), newRow); |
|
3729 |
|
3730 tv.setCurrentIndex(model.index(0, 0)); |
|
3731 QTest::qWait(60); |
|
3732 QTest::keyClick(&tv, Qt::Key_PageDown); // PageDown won't scroll when at the bottom |
|
3733 QTRY_COMPARE(tv.rowAt(tv.viewport()->height() - 1), tv.verticalHeader()->logicalIndex(model.rowCount() - 1)); |
|
3734 } |
|
3735 |
|
3736 template <typename T> |
|
3737 struct ValueSaver { |
|
3738 T &var, value; |
|
3739 ValueSaver(T &v) : var(v), value(v) { } |
|
3740 ~ValueSaver() { var = value; } |
|
3741 }; |
|
3742 |
|
3743 void tst_QTableView::task191545_dragSelectRows() |
|
3744 { |
|
3745 QStandardItemModel model(10, 10); |
|
3746 QTableView table; |
|
3747 table.setModel(&model); |
|
3748 table.setSelectionBehavior(QAbstractItemView::SelectItems); |
|
3749 table.setSelectionMode(QAbstractItemView::ExtendedSelection); |
|
3750 table.setMinimumSize(1000, 400); |
|
3751 table.show(); |
|
3752 QTest::qWait(200); |
|
3753 |
|
3754 ValueSaver<Qt::KeyboardModifiers> saver(QApplicationPrivate::modifier_buttons); |
|
3755 QApplicationPrivate::modifier_buttons = Qt::ControlModifier; |
|
3756 |
|
3757 { |
|
3758 QRect cellRect = table.visualRect(model.index(3, 0)); |
|
3759 QHeaderView *vHeader = table.verticalHeader(); |
|
3760 QWidget *vHeaderVp = vHeader->viewport(); |
|
3761 QPoint rowPos(5, (cellRect.top() + cellRect.bottom()) / 2); |
|
3762 QMouseEvent rowPressEvent(QEvent::MouseButtonPress, rowPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3763 qApp->sendEvent(vHeaderVp, &rowPressEvent); |
|
3764 |
|
3765 for (int i = 0; i < 4; ++i) { |
|
3766 rowPos.setY(rowPos.y() + cellRect.height()); |
|
3767 QMouseEvent moveEvent(QEvent::MouseMove, rowPos, Qt::NoButton, Qt::LeftButton, Qt::ControlModifier); |
|
3768 qApp->sendEvent(vHeaderVp, &moveEvent); |
|
3769 } |
|
3770 QMouseEvent rowReleaseEvent(QEvent::MouseButtonRelease, rowPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3771 qApp->sendEvent(vHeaderVp, &rowReleaseEvent); |
|
3772 |
|
3773 for (int i = 0; i < 4; ++i) { |
|
3774 QModelIndex index = model.index(3 + i, 0, table.rootIndex()); |
|
3775 QVERIFY(vHeader->selectionModel()->selectedRows().contains(index)); |
|
3776 } |
|
3777 } |
|
3778 |
|
3779 { |
|
3780 QRect cellRect = table.visualRect(model.index(0, 3)); |
|
3781 QHeaderView *hHeader = table.horizontalHeader(); |
|
3782 QWidget *hHeaderVp = hHeader->viewport(); |
|
3783 QPoint colPos((cellRect.left() + cellRect.right()) / 2, 5); |
|
3784 QMouseEvent colPressEvent(QEvent::MouseButtonPress, colPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3785 qApp->sendEvent(hHeaderVp, &colPressEvent); |
|
3786 |
|
3787 for (int i = 0; i < 4; ++i) { |
|
3788 colPos.setX(colPos.x() + cellRect.width()); |
|
3789 QMouseEvent moveEvent(QEvent::MouseMove, colPos, Qt::NoButton, Qt::LeftButton, Qt::ControlModifier); |
|
3790 qApp->sendEvent(hHeaderVp, &moveEvent); |
|
3791 } |
|
3792 QMouseEvent colReleaseEvent(QEvent::MouseButtonRelease, colPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3793 qApp->sendEvent(hHeaderVp, &colReleaseEvent); |
|
3794 |
|
3795 for (int i = 0; i < 4; ++i) { |
|
3796 QModelIndex index = model.index(0, 3 + i, table.rootIndex()); |
|
3797 QVERIFY(hHeader->selectionModel()->selectedColumns().contains(index)); |
|
3798 } |
|
3799 } |
|
3800 |
|
3801 { |
|
3802 QRect cellRect = table.visualRect(model.index(2, 2)); |
|
3803 QWidget *tableVp = table.viewport(); |
|
3804 QPoint cellPos = cellRect.center(); |
|
3805 QMouseEvent cellPressEvent(QEvent::MouseButtonPress, cellPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3806 qApp->sendEvent(tableVp, &cellPressEvent); |
|
3807 |
|
3808 for (int i = 0; i < 6; ++i) { |
|
3809 cellPos.setX(cellPos.x() + cellRect.width()); |
|
3810 cellPos.setY(cellPos.y() + cellRect.height()); |
|
3811 QMouseEvent moveEvent(QEvent::MouseMove, cellPos, Qt::NoButton, Qt::LeftButton, Qt::ControlModifier); |
|
3812 qApp->sendEvent(tableVp, &moveEvent); |
|
3813 } |
|
3814 QMouseEvent cellReleaseEvent(QEvent::MouseButtonRelease, cellPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3815 qApp->sendEvent(tableVp, &cellReleaseEvent); |
|
3816 |
|
3817 for (int i = 0; i < 6; ++i) |
|
3818 for (int j = 0; j < 6; ++j) { |
|
3819 QModelIndex index = model.index(2 + i, 2 + j, table.rootIndex()); |
|
3820 QVERIFY(table.selectionModel()->isSelected(index)); |
|
3821 } |
|
3822 } |
|
3823 |
|
3824 { |
|
3825 QRect cellRect = table.visualRect(model.index(3, 3)); |
|
3826 QWidget *tableVp = table.viewport(); |
|
3827 QPoint cellPos = cellRect.center(); |
|
3828 QMouseEvent cellPressEvent(QEvent::MouseButtonPress, cellPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3829 qApp->sendEvent(tableVp, &cellPressEvent); |
|
3830 |
|
3831 for (int i = 0; i < 6; ++i) { |
|
3832 cellPos.setX(cellPos.x() + cellRect.width()); |
|
3833 cellPos.setY(cellPos.y() + cellRect.height()); |
|
3834 QMouseEvent moveEvent(QEvent::MouseMove, cellPos, Qt::NoButton, Qt::LeftButton, Qt::ControlModifier); |
|
3835 qApp->sendEvent(tableVp, &moveEvent); |
|
3836 } |
|
3837 QMouseEvent cellReleaseEvent(QEvent::MouseButtonRelease, cellPos, Qt::LeftButton, Qt::NoButton, Qt::ControlModifier); |
|
3838 qApp->sendEvent(tableVp, &cellReleaseEvent); |
|
3839 |
|
3840 for (int i = 0; i < 6; ++i) |
|
3841 for (int j = 0; j < 6; ++j) { |
|
3842 QModelIndex index = model.index(3 + i, 3 + j, table.rootIndex()); |
|
3843 QVERIFY(!table.selectionModel()->isSelected(index)); |
|
3844 } |
|
3845 } |
|
3846 } |
|
3847 |
|
3848 void tst_QTableView::task234926_setHeaderSorting() |
|
3849 { |
|
3850 QStringListModel model; |
|
3851 QStringList data; |
|
3852 data << "orange" << "apple" << "banana" << "lemon" << "pumpkin"; |
|
3853 QStringList sortedDataA = data; |
|
3854 QStringList sortedDataD = data; |
|
3855 qSort(sortedDataA); |
|
3856 qSort(sortedDataD.begin(), sortedDataD.end(), qGreater<QString>()); |
|
3857 model.setStringList(data); |
|
3858 QTableView view; |
|
3859 view.setModel(&model); |
|
3860 // view.show(); |
|
3861 QTest::qWait(20); |
|
3862 QCOMPARE(model.stringList(), data); |
|
3863 view.setSortingEnabled(true); |
|
3864 view.sortByColumn(0, Qt::AscendingOrder); |
|
3865 QApplication::processEvents(); |
|
3866 QCOMPARE(model.stringList() , sortedDataA); |
|
3867 |
|
3868 view.horizontalHeader()->setSortIndicator(0, Qt::DescendingOrder); |
|
3869 QApplication::processEvents(); |
|
3870 QCOMPARE(model.stringList() , sortedDataD); |
|
3871 |
|
3872 QHeaderView *h = new QHeaderView(Qt::Horizontal); |
|
3873 h->setModel(&model); |
|
3874 view.setHorizontalHeader(h); |
|
3875 h->setSortIndicator(0, Qt::AscendingOrder); |
|
3876 QApplication::processEvents(); |
|
3877 QCOMPARE(model.stringList() , sortedDataA); |
|
3878 |
|
3879 h->setSortIndicator(0, Qt::DescendingOrder); |
|
3880 QApplication::processEvents(); |
|
3881 QCOMPARE(model.stringList() , sortedDataD); |
|
3882 } |
|
3883 |
|
3884 void tst_QTableView::taskQTBUG_5062_spansInconsistency() |
|
3885 { |
|
3886 const int nRows = 5; |
|
3887 const int nColumns = 5; |
|
3888 |
|
3889 QtTestTableModel model(nRows, nColumns); |
|
3890 QtTestTableView view; |
|
3891 view.setModel(&model); |
|
3892 |
|
3893 for (int i = 0; i < nRows; ++i) |
|
3894 view.setSpan(i, 0, 1, nColumns); |
|
3895 view.setSpan(2, 0, 1, 1); |
|
3896 view.setSpan(3, 0, 1, 1); |
|
3897 |
|
3898 VERIFY_SPANS_CONSISTENCY(&view); |
|
3899 } |
|
3900 |
|
3901 void tst_QTableView::taskQTBUG_4516_clickOnRichTextLabel() |
|
3902 { |
|
3903 QTableView view; |
|
3904 QStandardItemModel model(5,5); |
|
3905 view.setModel(&model); |
|
3906 QLabel label("rich text"); |
|
3907 label.setTextFormat(Qt::RichText); |
|
3908 view.setIndexWidget(model.index(1,1), &label); |
|
3909 view.setCurrentIndex(model.index(0,0)); |
|
3910 QCOMPARE(view.currentIndex(), model.index(0,0)); |
|
3911 |
|
3912 QTest::mouseClick(&label, Qt::LeftButton); |
|
3913 QCOMPARE(view.currentIndex(), model.index(1,1)); |
|
3914 |
|
3915 |
|
3916 } |
|
3917 |
|
3918 |
|
3919 void tst_QTableView::changeHeaderData() |
|
3920 { |
|
3921 QTableView view; |
|
3922 QStandardItemModel model(5,5); |
|
3923 view.setModel(&model); |
|
3924 view.show(); |
|
3925 QTest::qWaitForWindowShown(&view); |
|
3926 |
|
3927 QString text = "long long long text"; |
|
3928 const int textWidth = view.verticalHeader()->fontMetrics().width(text); |
|
3929 QVERIFY(view.verticalHeader()->width() < textWidth); |
|
3930 |
|
3931 model.setHeaderData(2, Qt::Vertical, text); |
|
3932 QTest::qWait(100); //leave time for layout |
|
3933 |
|
3934 QVERIFY(view.verticalHeader()->width() > textWidth); |
|
3935 } |
|
3936 |
|
3937 void tst_QTableView::taskQTBUG_5237_wheelEventOnHeader() |
|
3938 { |
|
3939 QTableView view; |
|
3940 QStandardItemModel model(500,5); |
|
3941 view.setModel(&model); |
|
3942 view.show(); |
|
3943 QTest::qWaitForWindowShown(&view); |
|
3944 |
|
3945 int sbValueBefore = view.verticalScrollBar()->value(); |
|
3946 QHeaderView *header = view.verticalHeader(); |
|
3947 QTest::mouseMove(header); |
|
3948 QWheelEvent wheelEvent(header->geometry().center(), -720, 0, 0); |
|
3949 QApplication::sendEvent(header->viewport(), &wheelEvent); |
|
3950 int sbValueAfter = view.verticalScrollBar()->value(); |
|
3951 QVERIFY(sbValueBefore != sbValueAfter); |
|
3952 } |
|
3953 |
|
3954 class TestTableView : public QTableView { |
|
3955 Q_OBJECT |
|
3956 public: |
|
3957 TestTableView(QWidget *parent = 0) : QTableView(parent) |
|
3958 { |
|
3959 connect(this, SIGNAL(entered(const QModelIndex&)), this, SLOT(openEditor(const QModelIndex&))); |
|
3960 } |
|
3961 ~TestTableView(){} |
|
3962 public slots: |
|
3963 void onDataChanged() |
|
3964 { |
|
3965 for (int i = 0; i < model()->rowCount(); i++) { |
|
3966 setRowHidden(i, model()->data(model()->index(i, 0)).toBool()); |
|
3967 } |
|
3968 } |
|
3969 |
|
3970 void openEditor(const QModelIndex& index) |
|
3971 { openPersistentEditor(index); } |
|
3972 }; |
|
3973 |
|
3974 |
|
3975 void tst_QTableView::taskQTBUG_8585_crashForNoGoodReason() |
|
3976 { |
|
3977 QStandardItemModel model; |
|
3978 model.insertColumn(0, QModelIndex()); |
|
3979 for(int i = 0; i < 20; i++) |
|
3980 { |
|
3981 model.insertRow(i); |
|
3982 } |
|
3983 |
|
3984 TestTableView w; |
|
3985 w.setMouseTracking(true); |
|
3986 w.setModel(&model); |
|
3987 connect(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), &w, SLOT(onDataChanged())); |
|
3988 w.show(); |
|
3989 QTest::qWaitForWindowShown(&w); |
|
3990 for (int i = 0; i < 10; i++) |
|
3991 { |
|
3992 QTest::mouseMove(w.viewport(), QPoint(50, 20)); |
|
3993 w.model()->setData(w.indexAt(QPoint(50, 20)), true); |
|
3994 QTest::mouseMove(w.viewport(), QPoint(50, 25)); |
|
3995 } |
|
3996 } |
|
3997 |
|
3998 class TableView7774 : public QTableView |
|
3999 { |
|
4000 public: |
|
4001 QRegion visualRegionForSelection(const QItemSelection &selection) const |
|
4002 { |
|
4003 return QTableView::visualRegionForSelection(selection); |
|
4004 } |
|
4005 }; |
|
4006 |
|
4007 void tst_QTableView::taskQTBUG_7774_RtoLVisualRegionForSelection() |
|
4008 { |
|
4009 TableView7774 view; |
|
4010 QStandardItemModel model(5,5); |
|
4011 view.setModel(&model); |
|
4012 view.setLayoutDirection(Qt::RightToLeft); |
|
4013 view.show(); |
|
4014 QTest::qWaitForWindowShown(&view); |
|
4015 |
|
4016 QItemSelectionRange range(model.index(2, 0), model.index(2, model.columnCount() - 1)); |
|
4017 QItemSelection selection; |
|
4018 selection << range; |
|
4019 QRegion region = view.visualRegionForSelection(selection); |
|
4020 QCOMPARE(region.rects().at(0), view.visualRect(range.topLeft()) | view.visualRect(range.bottomRight())); |
|
4021 } |
|
4022 |
|
4023 void tst_QTableView::taskQTBUG_8777_scrollToSpans() |
|
4024 { |
|
4025 QTableWidget table(75,5); |
|
4026 for (int i=0; i<50; i++) |
|
4027 table.setSpan(2+i, 0, 1, 5); |
|
4028 table.setCurrentCell(0,2); |
|
4029 table.show(); |
|
4030 |
|
4031 for (int i = 0; i < 45; ++i) |
|
4032 QTest::keyClick(&table, Qt::Key_Down); |
|
4033 |
|
4034 QVERIFY(table.verticalScrollBar()->value() > 10); |
|
4035 } |
|
4036 |
|
4037 QTEST_MAIN(tst_QTableView) |
|
4038 #include "tst_qtableview.moc" |