|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 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 QtGui module 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 #include "qtablewidget.h" |
|
43 |
|
44 #ifndef QT_NO_TABLEWIDGET |
|
45 #include <qitemdelegate.h> |
|
46 #include <qpainter.h> |
|
47 #include <private/qtablewidget_p.h> |
|
48 |
|
49 QT_BEGIN_NAMESPACE |
|
50 |
|
51 QTableModel::QTableModel(int rows, int columns, QTableWidget *parent) |
|
52 : QAbstractTableModel(parent), |
|
53 prototype(0), |
|
54 tableItems(rows * columns, 0), |
|
55 verticalHeaderItems(rows, 0), |
|
56 horizontalHeaderItems(columns, 0) |
|
57 {} |
|
58 |
|
59 QTableModel::~QTableModel() |
|
60 { |
|
61 clear(); |
|
62 delete prototype; |
|
63 } |
|
64 |
|
65 bool QTableModel::insertRows(int row, int count, const QModelIndex &) |
|
66 { |
|
67 if (count < 1 || row < 0 || row > verticalHeaderItems.count()) |
|
68 return false; |
|
69 |
|
70 beginInsertRows(QModelIndex(), row, row + count - 1); |
|
71 int rc = verticalHeaderItems.count(); |
|
72 int cc = horizontalHeaderItems.count(); |
|
73 verticalHeaderItems.insert(row, count, 0); |
|
74 if (rc == 0) |
|
75 tableItems.resize(cc * count); |
|
76 else |
|
77 tableItems.insert(tableIndex(row, 0), cc * count, 0); |
|
78 endInsertRows(); |
|
79 return true; |
|
80 } |
|
81 |
|
82 bool QTableModel::insertColumns(int column, int count, const QModelIndex &) |
|
83 { |
|
84 if (count < 1 || column < 0 || column > horizontalHeaderItems.count()) |
|
85 return false; |
|
86 |
|
87 beginInsertColumns(QModelIndex(), column, column + count - 1); |
|
88 int rc = verticalHeaderItems.count(); |
|
89 int cc = horizontalHeaderItems.count(); |
|
90 horizontalHeaderItems.insert(column, count, 0); |
|
91 if (cc == 0) |
|
92 tableItems.resize(rc * count); |
|
93 else |
|
94 for (int row = 0; row < rc; ++row) |
|
95 tableItems.insert(tableIndex(row, column), count, 0); |
|
96 endInsertColumns(); |
|
97 return true; |
|
98 } |
|
99 |
|
100 bool QTableModel::removeRows(int row, int count, const QModelIndex &) |
|
101 { |
|
102 if (count < 1 || row < 0 || row + count > verticalHeaderItems.count()) |
|
103 return false; |
|
104 |
|
105 beginRemoveRows(QModelIndex(), row, row + count - 1); |
|
106 int i = tableIndex(row, 0); |
|
107 int n = count * columnCount(); |
|
108 QTableWidgetItem *oldItem = 0; |
|
109 for (int j = i; j < n + i; ++j) { |
|
110 oldItem = tableItems.at(j); |
|
111 if (oldItem) |
|
112 oldItem->view = 0; |
|
113 delete oldItem; |
|
114 } |
|
115 tableItems.remove(qMax(i, 0), n); |
|
116 for (int v = row; v < row + count; ++v) { |
|
117 oldItem = verticalHeaderItems.at(v); |
|
118 if (oldItem) |
|
119 oldItem->view = 0; |
|
120 delete oldItem; |
|
121 } |
|
122 verticalHeaderItems.remove(row, count); |
|
123 endRemoveRows(); |
|
124 return true; |
|
125 } |
|
126 |
|
127 bool QTableModel::removeColumns(int column, int count, const QModelIndex &) |
|
128 { |
|
129 if (count < 1 || column < 0 || column + count > horizontalHeaderItems.count()) |
|
130 return false; |
|
131 |
|
132 beginRemoveColumns(QModelIndex(), column, column + count - 1); |
|
133 QTableWidgetItem *oldItem = 0; |
|
134 for (int row = rowCount() - 1; row >= 0; --row) { |
|
135 int i = tableIndex(row, column); |
|
136 for (int j = i; j < i + count; ++j) { |
|
137 oldItem = tableItems.at(j); |
|
138 if (oldItem) |
|
139 oldItem->view = 0; |
|
140 delete oldItem; |
|
141 } |
|
142 tableItems.remove(i, count); |
|
143 } |
|
144 for (int h=column; h<column+count; ++h) { |
|
145 oldItem = horizontalHeaderItems.at(h); |
|
146 if (oldItem) |
|
147 oldItem->view = 0; |
|
148 delete oldItem; |
|
149 } |
|
150 horizontalHeaderItems.remove(column, count); |
|
151 endRemoveColumns(); |
|
152 return true; |
|
153 } |
|
154 |
|
155 void QTableModel::setItem(int row, int column, QTableWidgetItem *item) |
|
156 { |
|
157 int i = tableIndex(row, column); |
|
158 if (i < 0 || i >= tableItems.count()) |
|
159 return; |
|
160 QTableWidgetItem *oldItem = tableItems.at(i); |
|
161 if (item == oldItem) |
|
162 return; |
|
163 |
|
164 // remove old |
|
165 if (oldItem) |
|
166 oldItem->view = 0; |
|
167 delete tableItems.at(i); |
|
168 |
|
169 QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); |
|
170 |
|
171 // set new |
|
172 if (item) |
|
173 item->d->id = i; |
|
174 tableItems[i] = item; |
|
175 |
|
176 if (view && view->isSortingEnabled() |
|
177 && view->horizontalHeader()->sortIndicatorSection() == column) { |
|
178 // sorted insertion |
|
179 Qt::SortOrder order = view->horizontalHeader()->sortIndicatorOrder(); |
|
180 QVector<QTableWidgetItem*> colItems = columnItems(column); |
|
181 if (row < colItems.count()) |
|
182 colItems.remove(row); |
|
183 int sortedRow; |
|
184 if (item == 0) { |
|
185 // move to after all non-0 (sortable) items |
|
186 sortedRow = colItems.count(); |
|
187 } else { |
|
188 QVector<QTableWidgetItem*>::iterator it; |
|
189 it = sortedInsertionIterator(colItems.begin(), colItems.end(), order, item); |
|
190 sortedRow = qMax((int)(it - colItems.begin()), 0); |
|
191 } |
|
192 if (sortedRow != row) { |
|
193 emit layoutAboutToBeChanged(); |
|
194 // move the items @ row to sortedRow |
|
195 int cc = columnCount(); |
|
196 QVector<QTableWidgetItem*> rowItems(cc); |
|
197 for (int j = 0; j < cc; ++j) |
|
198 rowItems[j] = tableItems.at(tableIndex(row, j)); |
|
199 tableItems.remove(tableIndex(row, 0), cc); |
|
200 tableItems.insert(tableIndex(sortedRow, 0), cc, 0); |
|
201 for (int j = 0; j < cc; ++j) |
|
202 tableItems[tableIndex(sortedRow, j)] = rowItems.at(j); |
|
203 QTableWidgetItem *header = verticalHeaderItems.at(row); |
|
204 verticalHeaderItems.remove(row); |
|
205 verticalHeaderItems.insert(sortedRow, header); |
|
206 // update persistent indexes |
|
207 QModelIndexList oldPersistentIndexes = persistentIndexList(); |
|
208 QModelIndexList newPersistentIndexes = oldPersistentIndexes; |
|
209 updateRowIndexes(newPersistentIndexes, row, sortedRow); |
|
210 changePersistentIndexList(oldPersistentIndexes, |
|
211 newPersistentIndexes); |
|
212 |
|
213 emit layoutChanged(); |
|
214 return; |
|
215 } |
|
216 } |
|
217 QModelIndex idx = QAbstractTableModel::index(row, column); |
|
218 emit dataChanged(idx, idx); |
|
219 } |
|
220 |
|
221 QTableWidgetItem *QTableModel::takeItem(int row, int column) |
|
222 { |
|
223 long i = tableIndex(row, column); |
|
224 QTableWidgetItem *itm = tableItems.value(i); |
|
225 if (itm) { |
|
226 itm->view = 0; |
|
227 itm->d->id = -1; |
|
228 tableItems[i] = 0; |
|
229 QModelIndex ind = index(itm); |
|
230 emit dataChanged(ind, ind); |
|
231 } |
|
232 return itm; |
|
233 } |
|
234 |
|
235 QTableWidgetItem *QTableModel::item(int row, int column) const |
|
236 { |
|
237 return tableItems.value(tableIndex(row, column)); |
|
238 } |
|
239 |
|
240 QTableWidgetItem *QTableModel::item(const QModelIndex &index) const |
|
241 { |
|
242 if (!isValid(index)) |
|
243 return 0; |
|
244 return tableItems.at(tableIndex(index.row(), index.column())); |
|
245 } |
|
246 |
|
247 void QTableModel::removeItem(QTableWidgetItem *item) |
|
248 { |
|
249 int i = tableItems.indexOf(item); |
|
250 if (i != -1) { |
|
251 tableItems[i] = 0; |
|
252 QModelIndex idx = index(item); |
|
253 emit dataChanged(idx, idx); |
|
254 return; |
|
255 } |
|
256 |
|
257 i = verticalHeaderItems.indexOf(item); |
|
258 |
|
259 if (i != -1) { |
|
260 verticalHeaderItems[i] = 0; |
|
261 emit headerDataChanged(Qt::Vertical, i, i); |
|
262 return; |
|
263 } |
|
264 i = horizontalHeaderItems.indexOf(item); |
|
265 if (i != -1) { |
|
266 horizontalHeaderItems[i] = 0; |
|
267 emit headerDataChanged(Qt::Horizontal, i, i); |
|
268 return; |
|
269 } |
|
270 } |
|
271 |
|
272 void QTableModel::setHorizontalHeaderItem(int section, QTableWidgetItem *item) |
|
273 { |
|
274 if (section < 0 || section >= horizontalHeaderItems.count()) |
|
275 return; |
|
276 QTableWidgetItem *oldItem = horizontalHeaderItems.at(section); |
|
277 if (item == oldItem) |
|
278 return; |
|
279 |
|
280 if (oldItem) |
|
281 oldItem->view = 0; |
|
282 delete oldItem; |
|
283 |
|
284 QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); |
|
285 |
|
286 if (item) { |
|
287 item->view = view; |
|
288 item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem); |
|
289 } |
|
290 horizontalHeaderItems[section] = item; |
|
291 emit headerDataChanged(Qt::Horizontal, section, section); |
|
292 } |
|
293 |
|
294 void QTableModel::setVerticalHeaderItem(int section, QTableWidgetItem *item) |
|
295 { |
|
296 if (section < 0 || section >= verticalHeaderItems.count()) |
|
297 return; |
|
298 QTableWidgetItem *oldItem = verticalHeaderItems.at(section); |
|
299 if (item == oldItem) |
|
300 return; |
|
301 |
|
302 if (oldItem) |
|
303 oldItem->view = 0; |
|
304 delete oldItem; |
|
305 |
|
306 QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); |
|
307 |
|
308 if (item) { |
|
309 item->view = view; |
|
310 item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem); |
|
311 } |
|
312 verticalHeaderItems[section] = item; |
|
313 emit headerDataChanged(Qt::Vertical, section, section); |
|
314 } |
|
315 |
|
316 QTableWidgetItem *QTableModel::takeHorizontalHeaderItem(int section) |
|
317 { |
|
318 if (section < 0 || section >= horizontalHeaderItems.count()) |
|
319 return 0; |
|
320 QTableWidgetItem *itm = horizontalHeaderItems.at(section); |
|
321 if (itm) { |
|
322 itm->view = 0; |
|
323 itm->itemFlags &= ~ItemIsHeaderItem; |
|
324 horizontalHeaderItems[section] = 0; |
|
325 } |
|
326 return itm; |
|
327 } |
|
328 |
|
329 QTableWidgetItem *QTableModel::takeVerticalHeaderItem(int section) |
|
330 { |
|
331 if (section < 0 || section >= verticalHeaderItems.count()) |
|
332 return 0; |
|
333 QTableWidgetItem *itm = verticalHeaderItems.at(section); |
|
334 if (itm) { |
|
335 itm->view = 0; |
|
336 itm->itemFlags &= ~ItemIsHeaderItem; |
|
337 verticalHeaderItems[section] = 0; |
|
338 } |
|
339 return itm; |
|
340 } |
|
341 |
|
342 QTableWidgetItem *QTableModel::horizontalHeaderItem(int section) |
|
343 { |
|
344 return horizontalHeaderItems.value(section); |
|
345 } |
|
346 |
|
347 QTableWidgetItem *QTableModel::verticalHeaderItem(int section) |
|
348 { |
|
349 return verticalHeaderItems.value(section); |
|
350 } |
|
351 |
|
352 QModelIndex QTableModel::index(const QTableWidgetItem *item) const |
|
353 { |
|
354 if (!item) |
|
355 return QModelIndex(); |
|
356 int i = -1; |
|
357 const int id = item->d->id; |
|
358 if (id >= 0 && id < tableItems.count() && tableItems.at(id) == item) { |
|
359 i = id; |
|
360 } else { // we need to search for the item |
|
361 i = tableItems.indexOf(const_cast<QTableWidgetItem*>(item)); |
|
362 if (i == -1) // not found |
|
363 return QModelIndex(); |
|
364 } |
|
365 int row = i / columnCount(); |
|
366 int col = i % columnCount(); |
|
367 return QAbstractTableModel::index(row, col); |
|
368 } |
|
369 |
|
370 void QTableModel::setRowCount(int rows) |
|
371 { |
|
372 int rc = verticalHeaderItems.count(); |
|
373 if (rows < 0 || rc == rows) |
|
374 return; |
|
375 if (rc < rows) |
|
376 insertRows(qMax(rc, 0), rows - rc); |
|
377 else |
|
378 removeRows(qMax(rows, 0), rc - rows); |
|
379 } |
|
380 |
|
381 void QTableModel::setColumnCount(int columns) |
|
382 { |
|
383 int cc = horizontalHeaderItems.count(); |
|
384 if (columns < 0 || cc == columns) |
|
385 return; |
|
386 if (cc < columns) |
|
387 insertColumns(qMax(cc, 0), columns - cc); |
|
388 else |
|
389 removeColumns(qMax(columns, 0), cc - columns); |
|
390 } |
|
391 |
|
392 int QTableModel::rowCount(const QModelIndex &parent) const |
|
393 { |
|
394 return parent.isValid() ? 0 : verticalHeaderItems.count(); |
|
395 } |
|
396 |
|
397 int QTableModel::columnCount(const QModelIndex &parent) const |
|
398 { |
|
399 return parent.isValid() ? 0 : horizontalHeaderItems.count(); |
|
400 } |
|
401 |
|
402 QVariant QTableModel::data(const QModelIndex &index, int role) const |
|
403 { |
|
404 QTableWidgetItem *itm = item(index); |
|
405 if (itm) |
|
406 return itm->data(role); |
|
407 return QVariant(); |
|
408 } |
|
409 |
|
410 bool QTableModel::setData(const QModelIndex &index, const QVariant &value, int role) |
|
411 { |
|
412 if (!index.isValid()) |
|
413 return false; |
|
414 |
|
415 QTableWidgetItem *itm = item(index); |
|
416 if (itm) { |
|
417 itm->setData(role, value); |
|
418 return true; |
|
419 } |
|
420 |
|
421 // don't create dummy table items for empty values |
|
422 if (!value.isValid()) |
|
423 return false; |
|
424 |
|
425 QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); |
|
426 if (!view) |
|
427 return false; |
|
428 |
|
429 itm = createItem(); |
|
430 itm->setData(role, value); |
|
431 view->setItem(index.row(), index.column(), itm); |
|
432 return true; |
|
433 } |
|
434 |
|
435 QMap<int, QVariant> QTableModel::itemData(const QModelIndex &index) const |
|
436 { |
|
437 QMap<int, QVariant> roles; |
|
438 QTableWidgetItem *itm = item(index); |
|
439 if (itm) { |
|
440 for (int i = 0; i < itm->values.count(); ++i) { |
|
441 roles.insert(itm->values.at(i).role, |
|
442 itm->values.at(i).value); |
|
443 } |
|
444 } |
|
445 return roles; |
|
446 } |
|
447 |
|
448 // reimplemented to ensure that only one dataChanged() signal is emitted |
|
449 bool QTableModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) |
|
450 { |
|
451 if (!index.isValid()) |
|
452 return false; |
|
453 |
|
454 QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); |
|
455 QTableWidgetItem *itm = item(index); |
|
456 if (itm) { |
|
457 itm->view = 0; // prohibits item from calling itemChanged() |
|
458 bool changed = false; |
|
459 for (QMap<int, QVariant>::ConstIterator it = roles.constBegin(); it != roles.constEnd(); ++it) { |
|
460 if (itm->data(it.key()) != it.value()) { |
|
461 itm->setData(it.key(), it.value()); |
|
462 changed = true; |
|
463 } |
|
464 } |
|
465 itm->view = view; |
|
466 if (changed) |
|
467 itemChanged(itm); |
|
468 return true; |
|
469 } |
|
470 |
|
471 if (!view) |
|
472 return false; |
|
473 |
|
474 itm = createItem(); |
|
475 for (QMap<int, QVariant>::ConstIterator it = roles.constBegin(); it != roles.constEnd(); ++it) |
|
476 itm->setData(it.key(), it.value()); |
|
477 view->setItem(index.row(), index.column(), itm); |
|
478 return true; |
|
479 } |
|
480 |
|
481 Qt::ItemFlags QTableModel::flags(const QModelIndex &index) const |
|
482 { |
|
483 if (!index.isValid()) |
|
484 return Qt::ItemIsDropEnabled; |
|
485 if (QTableWidgetItem *itm = item(index)) |
|
486 return itm->flags(); |
|
487 return (Qt::ItemIsEditable |
|
488 |Qt::ItemIsSelectable |
|
489 |Qt::ItemIsUserCheckable |
|
490 |Qt::ItemIsEnabled |
|
491 |Qt::ItemIsDragEnabled |
|
492 |Qt::ItemIsDropEnabled); |
|
493 } |
|
494 |
|
495 void QTableModel::sort(int column, Qt::SortOrder order) |
|
496 { |
|
497 QVector<QPair<QTableWidgetItem*, int> > sortable; |
|
498 QVector<int> unsortable; |
|
499 |
|
500 sortable.reserve(rowCount()); |
|
501 unsortable.reserve(rowCount()); |
|
502 |
|
503 for (int row = 0; row < rowCount(); ++row) { |
|
504 if (QTableWidgetItem *itm = item(row, column)) |
|
505 sortable.append(QPair<QTableWidgetItem*,int>(itm, row)); |
|
506 else |
|
507 unsortable.append(row); |
|
508 } |
|
509 |
|
510 LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); |
|
511 qStableSort(sortable.begin(), sortable.end(), compare); |
|
512 |
|
513 QVector<QTableWidgetItem*> sorted_table(tableItems.count()); |
|
514 QModelIndexList from; |
|
515 QModelIndexList to; |
|
516 for (int i = 0; i < rowCount(); ++i) { |
|
517 int r = (i < sortable.count() |
|
518 ? sortable.at(i).second |
|
519 : unsortable.at(i - sortable.count())); |
|
520 for (int c = 0; c < columnCount(); ++c) { |
|
521 sorted_table[tableIndex(i, c)] = item(r, c); |
|
522 from.append(createIndex(r, c, 0)); |
|
523 to.append(createIndex(i, c, 0)); |
|
524 } |
|
525 } |
|
526 |
|
527 emit layoutAboutToBeChanged(); |
|
528 |
|
529 tableItems = sorted_table; |
|
530 changePersistentIndexList(from, to); // ### slow |
|
531 |
|
532 emit layoutChanged(); |
|
533 } |
|
534 |
|
535 /* |
|
536 \internal |
|
537 |
|
538 Ensures that rows in the interval [start, end] are |
|
539 sorted according to the contents of column \a column |
|
540 and the given sort \a order. |
|
541 */ |
|
542 void QTableModel::ensureSorted(int column, Qt::SortOrder order, |
|
543 int start, int end) |
|
544 { |
|
545 int count = end - start + 1; |
|
546 QVector < QPair<QTableWidgetItem*,int> > sorting; |
|
547 sorting.reserve(count); |
|
548 for (int row = start; row <= end; ++row) { |
|
549 QTableWidgetItem *itm = item(row, column); |
|
550 if (itm == 0) { |
|
551 // no more sortable items (all 0-items are |
|
552 // at the end of the table when it is sorted) |
|
553 break; |
|
554 } |
|
555 sorting.append(QPair<QTableWidgetItem*,int>(itm, row)); |
|
556 } |
|
557 |
|
558 LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); |
|
559 qStableSort(sorting.begin(), sorting.end(), compare); |
|
560 |
|
561 QModelIndexList oldPersistentIndexes = persistentIndexList(); |
|
562 QModelIndexList newPersistentIndexes = oldPersistentIndexes; |
|
563 QVector<QTableWidgetItem*> newTable = tableItems; |
|
564 QVector<QTableWidgetItem*> newVertical = verticalHeaderItems; |
|
565 QVector<QTableWidgetItem*> colItems = columnItems(column); |
|
566 QVector<QTableWidgetItem*>::iterator vit = colItems.begin(); |
|
567 bool changed = false; |
|
568 for (int i = 0; i < sorting.count(); ++i) { |
|
569 int oldRow = sorting.at(i).second; |
|
570 QTableWidgetItem *item = colItems.at(oldRow); |
|
571 colItems.remove(oldRow); |
|
572 vit = sortedInsertionIterator(vit, colItems.end(), order, item); |
|
573 int newRow = qMax((int)(vit - colItems.begin()), 0); |
|
574 if ((newRow < oldRow) && !(*item < *colItems.at(oldRow - 1)) && !(*colItems.at(oldRow - 1) < *item)) |
|
575 newRow = oldRow; |
|
576 vit = colItems.insert(vit, item); |
|
577 if (newRow != oldRow) { |
|
578 changed = true; |
|
579 // move the items @ oldRow to newRow |
|
580 int cc = columnCount(); |
|
581 QVector<QTableWidgetItem*> rowItems(cc); |
|
582 for (int j = 0; j < cc; ++j) |
|
583 rowItems[j] = newTable.at(tableIndex(oldRow, j)); |
|
584 newTable.remove(tableIndex(oldRow, 0), cc); |
|
585 newTable.insert(tableIndex(newRow, 0), cc, 0); |
|
586 for (int j = 0; j < cc; ++j) |
|
587 newTable[tableIndex(newRow, j)] = rowItems.at(j); |
|
588 QTableWidgetItem *header = newVertical.at(oldRow); |
|
589 newVertical.remove(oldRow); |
|
590 newVertical.insert(newRow, header); |
|
591 // update persistent indexes |
|
592 updateRowIndexes(newPersistentIndexes, oldRow, newRow); |
|
593 // the index of the remaining rows may have changed |
|
594 for (int j = i + 1; j < sorting.count(); ++j) { |
|
595 int otherRow = sorting.at(j).second; |
|
596 if (oldRow < otherRow && newRow >= otherRow) |
|
597 --sorting[j].second; |
|
598 else if (oldRow > otherRow && newRow <= otherRow) |
|
599 ++sorting[j].second; |
|
600 } |
|
601 } |
|
602 } |
|
603 |
|
604 if (changed) { |
|
605 emit layoutAboutToBeChanged(); |
|
606 tableItems = newTable; |
|
607 verticalHeaderItems = newVertical; |
|
608 changePersistentIndexList(oldPersistentIndexes, |
|
609 newPersistentIndexes); |
|
610 emit layoutChanged(); |
|
611 } |
|
612 } |
|
613 |
|
614 /* |
|
615 \internal |
|
616 |
|
617 Returns the non-0 items in column \a column. |
|
618 */ |
|
619 QVector<QTableWidgetItem*> QTableModel::columnItems(int column) const |
|
620 { |
|
621 QVector<QTableWidgetItem*> items; |
|
622 int rc = rowCount(); |
|
623 items.reserve(rc); |
|
624 for (int row = 0; row < rc; ++row) { |
|
625 QTableWidgetItem *itm = item(row, column); |
|
626 if (itm == 0) { |
|
627 // no more sortable items (all 0-items are |
|
628 // at the end of the table when it is sorted) |
|
629 break; |
|
630 } |
|
631 items.append(itm); |
|
632 } |
|
633 return items; |
|
634 } |
|
635 |
|
636 /* |
|
637 \internal |
|
638 |
|
639 Adjusts the row of each index in \a indexes if necessary, given |
|
640 that a row of items has been moved from row \a movedFrom to row |
|
641 \a movedTo. |
|
642 */ |
|
643 void QTableModel::updateRowIndexes(QModelIndexList &indexes, |
|
644 int movedFromRow, int movedToRow) |
|
645 { |
|
646 QModelIndexList::iterator it; |
|
647 for (it = indexes.begin(); it != indexes.end(); ++it) { |
|
648 int oldRow = (*it).row(); |
|
649 int newRow = oldRow; |
|
650 if (oldRow == movedFromRow) |
|
651 newRow = movedToRow; |
|
652 else if (movedFromRow < oldRow && movedToRow >= oldRow) |
|
653 newRow = oldRow - 1; |
|
654 else if (movedFromRow > oldRow && movedToRow <= oldRow) |
|
655 newRow = oldRow + 1; |
|
656 if (newRow != oldRow) |
|
657 *it = index(newRow, (*it).column(), (*it).parent()); |
|
658 } |
|
659 } |
|
660 |
|
661 /* |
|
662 \internal |
|
663 |
|
664 Returns an iterator to the item where \a item should be |
|
665 inserted in the interval (\a begin, \a end) according to |
|
666 the given sort \a order. |
|
667 */ |
|
668 QVector<QTableWidgetItem*>::iterator QTableModel::sortedInsertionIterator( |
|
669 const QVector<QTableWidgetItem*>::iterator &begin, |
|
670 const QVector<QTableWidgetItem*>::iterator &end, |
|
671 Qt::SortOrder order, QTableWidgetItem *item) |
|
672 { |
|
673 if (order == Qt::AscendingOrder) |
|
674 return qLowerBound(begin, end, item, QTableModelLessThan()); |
|
675 return qLowerBound(begin, end, item, QTableModelGreaterThan()); |
|
676 } |
|
677 |
|
678 bool QTableModel::itemLessThan(const QPair<QTableWidgetItem*,int> &left, |
|
679 const QPair<QTableWidgetItem*,int> &right) |
|
680 { |
|
681 return *(left.first) < *(right.first); |
|
682 } |
|
683 |
|
684 bool QTableModel::itemGreaterThan(const QPair<QTableWidgetItem*,int> &left, |
|
685 const QPair<QTableWidgetItem*,int> &right) |
|
686 { |
|
687 return (*(right.first) < *(left .first)); |
|
688 } |
|
689 |
|
690 QVariant QTableModel::headerData(int section, Qt::Orientation orientation, int role) const |
|
691 { |
|
692 if (section < 0) |
|
693 return QVariant(); |
|
694 |
|
695 QTableWidgetItem *itm = 0; |
|
696 if (orientation == Qt::Horizontal && section < horizontalHeaderItems.count()) |
|
697 itm = horizontalHeaderItems.at(section); |
|
698 else if (orientation == Qt::Vertical && section < verticalHeaderItems.count()) |
|
699 itm = verticalHeaderItems.at(section); |
|
700 else |
|
701 return QVariant(); // section is out of bounds |
|
702 |
|
703 if (itm) |
|
704 return itm->data(role); |
|
705 if (role == Qt::DisplayRole) |
|
706 return section + 1; |
|
707 return QVariant(); |
|
708 } |
|
709 |
|
710 bool QTableModel::setHeaderData(int section, Qt::Orientation orientation, |
|
711 const QVariant &value, int role) |
|
712 { |
|
713 if (section < 0 || |
|
714 (orientation == Qt::Horizontal && horizontalHeaderItems.size() <= section) || |
|
715 (orientation == Qt::Vertical && verticalHeaderItems.size() <= section)) |
|
716 return false; |
|
717 |
|
718 QTableWidgetItem *itm = 0; |
|
719 if (orientation == Qt::Horizontal) |
|
720 itm = horizontalHeaderItems.at(section); |
|
721 else |
|
722 itm = verticalHeaderItems.at(section); |
|
723 if (itm) { |
|
724 itm->setData(role, value); |
|
725 return true; |
|
726 } |
|
727 return false; |
|
728 } |
|
729 |
|
730 bool QTableModel::isValid(const QModelIndex &index) const |
|
731 { |
|
732 return (index.isValid() |
|
733 && index.row() < verticalHeaderItems.count() |
|
734 && index.column() < horizontalHeaderItems.count()); |
|
735 } |
|
736 |
|
737 void QTableModel::clear() |
|
738 { |
|
739 for (int j = 0; j < verticalHeaderItems.count(); ++j) { |
|
740 if (verticalHeaderItems.at(j)) { |
|
741 verticalHeaderItems.at(j)->view = 0; |
|
742 delete verticalHeaderItems.at(j); |
|
743 verticalHeaderItems[j] = 0; |
|
744 } |
|
745 } |
|
746 for (int k = 0; k < horizontalHeaderItems.count(); ++k) { |
|
747 if (horizontalHeaderItems.at(k)) { |
|
748 horizontalHeaderItems.at(k)->view = 0; |
|
749 delete horizontalHeaderItems.at(k); |
|
750 horizontalHeaderItems[k] = 0; |
|
751 } |
|
752 } |
|
753 clearContents(); |
|
754 } |
|
755 |
|
756 void QTableModel::clearContents() |
|
757 { |
|
758 for (int i = 0; i < tableItems.count(); ++i) { |
|
759 if (tableItems.at(i)) { |
|
760 tableItems.at(i)->view = 0; |
|
761 delete tableItems.at(i); |
|
762 tableItems[i] = 0; |
|
763 } |
|
764 } |
|
765 reset(); |
|
766 } |
|
767 |
|
768 void QTableModel::itemChanged(QTableWidgetItem *item) |
|
769 { |
|
770 if (!item) |
|
771 return; |
|
772 if (item->flags() & ItemIsHeaderItem) { |
|
773 int row = verticalHeaderItems.indexOf(item); |
|
774 if (row >= 0) { |
|
775 emit headerDataChanged(Qt::Vertical, row, row); |
|
776 } else { |
|
777 int column = horizontalHeaderItems.indexOf(item); |
|
778 if (column >= 0) |
|
779 emit headerDataChanged(Qt::Horizontal, column, column); |
|
780 } |
|
781 } else { |
|
782 QModelIndex idx = index(item); |
|
783 if (idx.isValid()) |
|
784 emit dataChanged(idx, idx); |
|
785 } |
|
786 } |
|
787 |
|
788 QTableWidgetItem* QTableModel::createItem() const |
|
789 { |
|
790 return prototype ? prototype->clone() : new QTableWidgetItem; |
|
791 } |
|
792 |
|
793 const QTableWidgetItem *QTableModel::itemPrototype() const |
|
794 { |
|
795 return prototype; |
|
796 } |
|
797 |
|
798 void QTableModel::setItemPrototype(const QTableWidgetItem *item) |
|
799 { |
|
800 if (prototype != item) { |
|
801 delete prototype; |
|
802 prototype = item; |
|
803 } |
|
804 } |
|
805 |
|
806 QStringList QTableModel::mimeTypes() const |
|
807 { |
|
808 const QTableWidget *view = qobject_cast<const QTableWidget*>(QObject::parent()); |
|
809 return (view ? view->mimeTypes() : QStringList()); |
|
810 } |
|
811 |
|
812 QMimeData *QTableModel::internalMimeData() const |
|
813 { |
|
814 return QAbstractTableModel::mimeData(cachedIndexes); |
|
815 } |
|
816 |
|
817 QMimeData *QTableModel::mimeData(const QModelIndexList &indexes) const |
|
818 { |
|
819 QList<QTableWidgetItem*> items; |
|
820 for (int i = 0; i < indexes.count(); ++i) |
|
821 items << item(indexes.at(i)); |
|
822 const QTableWidget *view = qobject_cast<const QTableWidget*>(QObject::parent()); |
|
823 |
|
824 // cachedIndexes is a little hack to avoid copying from QModelIndexList to |
|
825 // QList<QTreeWidgetItem*> and back again in the view |
|
826 cachedIndexes = indexes; |
|
827 QMimeData *mimeData = (view ? view->mimeData(items) : 0); |
|
828 cachedIndexes.clear(); |
|
829 return mimeData; |
|
830 } |
|
831 |
|
832 bool QTableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, |
|
833 int row , int column, const QModelIndex &index) |
|
834 { |
|
835 if (index.isValid()) { |
|
836 row = index.row(); |
|
837 column = index.column(); |
|
838 }else if (row == -1 || column == -1) { // The user dropped outside the table. |
|
839 row = rowCount(); |
|
840 column = 0; |
|
841 } |
|
842 |
|
843 QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); |
|
844 return (view ? view->dropMimeData(row, column, data, action) : false); |
|
845 } |
|
846 |
|
847 Qt::DropActions QTableModel::supportedDropActions() const |
|
848 { |
|
849 const QTableWidget *view = qobject_cast<const QTableWidget*>(QObject::parent()); |
|
850 return (view ? view->supportedDropActions() : Qt::DropActions(Qt::IgnoreAction)); |
|
851 } |
|
852 |
|
853 /*! |
|
854 \class QTableWidgetSelectionRange |
|
855 |
|
856 \brief The QTableWidgetSelectionRange class provides a way to interact with |
|
857 selection in a model without using model indexes and a selection model. |
|
858 |
|
859 \ingroup model-view |
|
860 |
|
861 The QTableWidgetSelectionRange class stores the top left and bottom |
|
862 right rows and columns of a selection range in a table. The |
|
863 selections in the table may consist of several selection ranges. |
|
864 |
|
865 \note If the item within the selection range is marked as not selectable, |
|
866 e.g., \c{itemFlags() & Qt::ItemIsSelectable == 0} then it will not appear |
|
867 in the selection range. |
|
868 |
|
869 \sa QTableWidget |
|
870 */ |
|
871 |
|
872 /*! |
|
873 Constructs an table selection range, i.e. a range |
|
874 whose rowCount() and columnCount() are 0. |
|
875 */ |
|
876 QTableWidgetSelectionRange::QTableWidgetSelectionRange() |
|
877 : top(-1), left(-1), bottom(-2), right(-2) |
|
878 { |
|
879 } |
|
880 |
|
881 /*! |
|
882 Constructs the table selection range from the given \a top, \a |
|
883 left, \a bottom and \a right table rows and columns. |
|
884 |
|
885 \sa topRow(), leftColumn(), bottomRow(), rightColumn() |
|
886 */ |
|
887 QTableWidgetSelectionRange::QTableWidgetSelectionRange(int top, int left, int bottom, int right) |
|
888 : top(top), left(left), bottom(bottom), right(right) |
|
889 { |
|
890 } |
|
891 |
|
892 /*! |
|
893 Constructs a the table selection range by copying the given \a |
|
894 other table selection range. |
|
895 */ |
|
896 QTableWidgetSelectionRange::QTableWidgetSelectionRange(const QTableWidgetSelectionRange &other) |
|
897 : top(other.top), left(other.left), bottom(other.bottom), right(other.right) |
|
898 { |
|
899 } |
|
900 |
|
901 /*! |
|
902 Destroys the table selection range. |
|
903 */ |
|
904 QTableWidgetSelectionRange::~QTableWidgetSelectionRange() |
|
905 { |
|
906 } |
|
907 |
|
908 /*! |
|
909 \fn int QTableWidgetSelectionRange::topRow() const |
|
910 |
|
911 Returns the top row of the range. |
|
912 |
|
913 \sa bottomRow(), leftColumn(), rowCount() |
|
914 */ |
|
915 |
|
916 /*! |
|
917 \fn int QTableWidgetSelectionRange::bottomRow() const |
|
918 |
|
919 Returns the bottom row of the range. |
|
920 |
|
921 \sa topRow(), rightColumn(), rowCount() |
|
922 */ |
|
923 |
|
924 /*! |
|
925 \fn int QTableWidgetSelectionRange::leftColumn() const |
|
926 |
|
927 Returns the left column of the range. |
|
928 |
|
929 \sa rightColumn(), topRow(), columnCount() |
|
930 */ |
|
931 |
|
932 /*! |
|
933 \fn int QTableWidgetSelectionRange::rightColumn() const |
|
934 |
|
935 Returns the right column of the range. |
|
936 |
|
937 \sa leftColumn(), bottomRow(), columnCount() |
|
938 */ |
|
939 |
|
940 /*! |
|
941 \since 4.1 |
|
942 \fn int QTableWidgetSelectionRange::rowCount() const |
|
943 |
|
944 Returns the number of rows in the range. |
|
945 |
|
946 This is equivalent to bottomRow() - topRow() + 1. |
|
947 |
|
948 \sa columnCount(), topRow(), bottomRow() |
|
949 */ |
|
950 |
|
951 /*! |
|
952 \since 4.1 |
|
953 \fn int QTableWidgetSelectionRange::columnCount() const |
|
954 |
|
955 Returns the number of columns in the range. |
|
956 |
|
957 This is equivalent to rightColumn() - leftColumn() + 1. |
|
958 |
|
959 \sa rowCount(), leftColumn(), rightColumn() |
|
960 */ |
|
961 |
|
962 /*! |
|
963 \class QTableWidgetItem |
|
964 \brief The QTableWidgetItem class provides an item for use with the |
|
965 QTableWidget class. |
|
966 |
|
967 \ingroup model-view |
|
968 |
|
969 Table items are used to hold pieces of information for table widgets. |
|
970 Items usually contain text, icons, or checkboxes |
|
971 |
|
972 The QTableWidgetItem class is a convenience class that replaces the |
|
973 \c QTableItem class in Qt 3. It provides an item for use with |
|
974 the QTableWidget class. |
|
975 |
|
976 Top-level items are constructed without a parent then inserted at the |
|
977 position specified by a pair of row and column numbers: |
|
978 |
|
979 \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 3 |
|
980 |
|
981 Each item can have its own background brush which is set with |
|
982 the setBackground() function. The current background brush can be |
|
983 found with background(). |
|
984 The text label for each item can be rendered with its own font and brush. |
|
985 These are specified with the setFont() and setForeground() functions, |
|
986 and read with font() and foreground(). |
|
987 |
|
988 By default, items are enabled, editable, selectable, checkable, and can be |
|
989 used both as the source of a drag and drop operation and as a drop target. |
|
990 Each item's flags can be changed by calling setFlags() with the appropriate |
|
991 value (see \l{Qt::ItemFlags}). Checkable items can be checked and unchecked |
|
992 with the setCheckState() function. The corresponding checkState() function |
|
993 indicates whether the item is currently checked. |
|
994 |
|
995 \section1 Subclassing |
|
996 |
|
997 When subclassing QTableWidgetItem to provide custom items, it is possible to |
|
998 define new types for them so that they can be distinguished from standard |
|
999 items. The constructors for subclasses that require this feature need to |
|
1000 call the base class constructor with a new type value equal to or greater |
|
1001 than \l UserType. |
|
1002 |
|
1003 \sa QTableWidget, {Model/View Programming}, QListWidgetItem, QTreeWidgetItem |
|
1004 */ |
|
1005 |
|
1006 /*! |
|
1007 \fn int QTableWidgetItem::row() const |
|
1008 \since 4.2 |
|
1009 |
|
1010 Returns the row of the item in the table. |
|
1011 If the item is not in a table, this function will return -1. |
|
1012 |
|
1013 \sa column() |
|
1014 */ |
|
1015 |
|
1016 /*! |
|
1017 \fn int QTableWidgetItem::column() const |
|
1018 \since 4.2 |
|
1019 |
|
1020 Returns the column of the item in the table. |
|
1021 If the item is not in a table, this function will return -1. |
|
1022 |
|
1023 \sa row() |
|
1024 */ |
|
1025 |
|
1026 /*! |
|
1027 \fn void QTableWidgetItem::setSelected(bool select) |
|
1028 \since 4.2 |
|
1029 |
|
1030 Sets the selected state of the item to \a select. |
|
1031 |
|
1032 \sa isSelected() |
|
1033 */ |
|
1034 |
|
1035 /*! |
|
1036 \fn bool QTableWidgetItem::isSelected() const |
|
1037 \since 4.2 |
|
1038 |
|
1039 Returns true if the item is selected, otherwise returns false. |
|
1040 |
|
1041 \sa setSelected() |
|
1042 */ |
|
1043 |
|
1044 /*! |
|
1045 \fn QSize QTableWidgetItem::sizeHint() const |
|
1046 \since 4.1 |
|
1047 |
|
1048 Returns the size hint set for the table item. |
|
1049 */ |
|
1050 |
|
1051 /*! |
|
1052 \fn void QTableWidgetItem::setSizeHint(const QSize &size) |
|
1053 \since 4.1 |
|
1054 |
|
1055 Sets the size hint for the table item to be \a size. |
|
1056 If no size hint is set, the item delegate will compute the |
|
1057 size hint based on the item data. |
|
1058 */ |
|
1059 |
|
1060 /*! |
|
1061 \fn Qt::CheckState QTableWidgetItem::checkState() const |
|
1062 |
|
1063 Returns the checked state of the table item. |
|
1064 |
|
1065 \sa flags() |
|
1066 */ |
|
1067 |
|
1068 /*! |
|
1069 \fn void QTableWidgetItem::setCheckState(Qt::CheckState state) |
|
1070 |
|
1071 Sets the check state of the table item to be \a state. |
|
1072 */ |
|
1073 |
|
1074 /*! |
|
1075 \fn QTableWidget *QTableWidgetItem::tableWidget() const |
|
1076 |
|
1077 Returns the table widget that contains the item. |
|
1078 */ |
|
1079 |
|
1080 /*! |
|
1081 \fn Qt::ItemFlags QTableWidgetItem::flags() const |
|
1082 |
|
1083 Returns the flags used to describe the item. These determine whether |
|
1084 the item can be checked, edited, and selected. |
|
1085 |
|
1086 \sa setFlags() |
|
1087 */ |
|
1088 |
|
1089 /*! |
|
1090 \fn void QTableWidgetItem::setFlags(Qt::ItemFlags flags) |
|
1091 |
|
1092 Sets the flags for the item to the given \a flags. These determine whether |
|
1093 the item can be selected or modified. |
|
1094 |
|
1095 \sa flags() |
|
1096 */ |
|
1097 void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) |
|
1098 { |
|
1099 itemFlags = aflags; |
|
1100 if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) |
|
1101 model->itemChanged(this); |
|
1102 } |
|
1103 |
|
1104 |
|
1105 /*! |
|
1106 \fn QString QTableWidgetItem::text() const |
|
1107 |
|
1108 Returns the item's text. |
|
1109 |
|
1110 \sa setText() |
|
1111 */ |
|
1112 |
|
1113 /*! |
|
1114 \fn void QTableWidgetItem::setText(const QString &text) |
|
1115 |
|
1116 Sets the item's text to the \a text specified. |
|
1117 |
|
1118 \sa text() setFont() setForeground() |
|
1119 */ |
|
1120 |
|
1121 /*! |
|
1122 \fn QIcon QTableWidgetItem::icon() const |
|
1123 |
|
1124 Returns the item's icon. |
|
1125 |
|
1126 \sa setIcon(), {QAbstractItemView::iconSize}{iconSize} |
|
1127 */ |
|
1128 |
|
1129 /*! |
|
1130 \fn void QTableWidgetItem::setIcon(const QIcon &icon) |
|
1131 |
|
1132 Sets the item's icon to the \a icon specified. |
|
1133 |
|
1134 \sa icon(), setText(), {QAbstractItemView::iconSize}{iconSize} |
|
1135 */ |
|
1136 |
|
1137 /*! |
|
1138 \fn QString QTableWidgetItem::statusTip() const |
|
1139 |
|
1140 Returns the item's status tip. |
|
1141 |
|
1142 \sa setStatusTip() |
|
1143 */ |
|
1144 |
|
1145 /*! |
|
1146 \fn void QTableWidgetItem::setStatusTip(const QString &statusTip) |
|
1147 |
|
1148 Sets the status tip for the table item to the text specified by |
|
1149 \a statusTip. QTableWidget mouse tracking needs to be enabled for this |
|
1150 feature to work. |
|
1151 |
|
1152 \sa statusTip() setToolTip() setWhatsThis() |
|
1153 */ |
|
1154 |
|
1155 /*! |
|
1156 \fn QString QTableWidgetItem::toolTip() const |
|
1157 |
|
1158 Returns the item's tooltip. |
|
1159 |
|
1160 \sa setToolTip() |
|
1161 */ |
|
1162 |
|
1163 /*! |
|
1164 \fn void QTableWidgetItem::setToolTip(const QString &toolTip) |
|
1165 |
|
1166 Sets the item's tooltip to the string specified by \a toolTip. |
|
1167 |
|
1168 \sa toolTip() setStatusTip() setWhatsThis() |
|
1169 */ |
|
1170 |
|
1171 /*! |
|
1172 \fn QString QTableWidgetItem::whatsThis() const |
|
1173 |
|
1174 Returns the item's "What's This?" help. |
|
1175 |
|
1176 \sa setWhatsThis() |
|
1177 */ |
|
1178 |
|
1179 /*! |
|
1180 \fn void QTableWidgetItem::setWhatsThis(const QString &whatsThis) |
|
1181 |
|
1182 Sets the item's "What's This?" help to the string specified by \a whatsThis. |
|
1183 |
|
1184 \sa whatsThis() setStatusTip() setToolTip() |
|
1185 */ |
|
1186 |
|
1187 /*! |
|
1188 \fn QFont QTableWidgetItem::font() const |
|
1189 |
|
1190 Returns the font used to render the item's text. |
|
1191 |
|
1192 \sa setFont() |
|
1193 */ |
|
1194 |
|
1195 /*! |
|
1196 \fn void QTableWidgetItem::setFont(const QFont &font) |
|
1197 |
|
1198 Sets the font used to display the item's text to the given \a font. |
|
1199 |
|
1200 \sa font() setText() setForeground() |
|
1201 */ |
|
1202 |
|
1203 /*! |
|
1204 \fn QColor QTableWidgetItem::backgroundColor() const |
|
1205 \obsolete |
|
1206 |
|
1207 This function is deprecated. Use background() instead. |
|
1208 */ |
|
1209 |
|
1210 /*! |
|
1211 \fn void QTableWidgetItem::setBackgroundColor(const QColor &color) |
|
1212 \obsolete |
|
1213 |
|
1214 This function is deprecated. Use setBackground() instead. |
|
1215 */ |
|
1216 |
|
1217 /*! |
|
1218 \fn QBrush QTableWidgetItem::background() const |
|
1219 \since 4.2 |
|
1220 |
|
1221 Returns the brush used to render the item's background. |
|
1222 |
|
1223 \sa foreground() |
|
1224 */ |
|
1225 |
|
1226 /*! |
|
1227 \fn void QTableWidgetItem::setBackground(const QBrush &brush) |
|
1228 \since 4.2 |
|
1229 |
|
1230 Sets the item's background brush to the specified \a brush. |
|
1231 |
|
1232 \sa setForeground() |
|
1233 */ |
|
1234 |
|
1235 /*! |
|
1236 \fn QColor QTableWidgetItem::textColor() const |
|
1237 \obsolete |
|
1238 |
|
1239 This function is deprecated. Use foreground() instead. |
|
1240 */ |
|
1241 |
|
1242 /*! |
|
1243 \fn void QTableWidgetItem::setTextColor(const QColor &color) |
|
1244 \obsolete |
|
1245 |
|
1246 This function is deprecated. Use setForeground() instead. |
|
1247 */ |
|
1248 |
|
1249 /*! |
|
1250 \fn QBrush QTableWidgetItem::foreground() const |
|
1251 \since 4.2 |
|
1252 |
|
1253 Returns the brush used to render the item's foreground (e.g. text). |
|
1254 |
|
1255 \sa background() |
|
1256 */ |
|
1257 |
|
1258 /*! |
|
1259 \fn void QTableWidgetItem::setForeground(const QBrush &brush) |
|
1260 \since 4.2 |
|
1261 |
|
1262 Sets the item's foreground brush to the specified \a brush. |
|
1263 |
|
1264 \sa setBackground() |
|
1265 */ |
|
1266 |
|
1267 /*! |
|
1268 \fn int QTableWidgetItem::textAlignment() const |
|
1269 |
|
1270 Returns the text alignment for the item's text. |
|
1271 |
|
1272 \sa Qt::Alignment |
|
1273 */ |
|
1274 |
|
1275 /*! |
|
1276 \fn void QTableWidgetItem::setTextAlignment(int alignment) |
|
1277 |
|
1278 Sets the text alignment for the item's text to the \a alignment |
|
1279 specified. |
|
1280 |
|
1281 \sa Qt::Alignment |
|
1282 */ |
|
1283 |
|
1284 /*! |
|
1285 Constructs a table item of the specified \a type that does not belong |
|
1286 to any table. |
|
1287 |
|
1288 \sa type() |
|
1289 */ |
|
1290 QTableWidgetItem::QTableWidgetItem(int type) |
|
1291 : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), |
|
1292 itemFlags(Qt::ItemIsEditable |
|
1293 |Qt::ItemIsSelectable |
|
1294 |Qt::ItemIsUserCheckable |
|
1295 |Qt::ItemIsEnabled |
|
1296 |Qt::ItemIsDragEnabled |
|
1297 |Qt::ItemIsDropEnabled) |
|
1298 { |
|
1299 } |
|
1300 |
|
1301 /*! |
|
1302 Constructs a table item with the given \a text. |
|
1303 |
|
1304 \sa type() |
|
1305 */ |
|
1306 QTableWidgetItem::QTableWidgetItem(const QString &text, int type) |
|
1307 : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), |
|
1308 itemFlags(Qt::ItemIsEditable |
|
1309 |Qt::ItemIsSelectable |
|
1310 |Qt::ItemIsUserCheckable |
|
1311 |Qt::ItemIsEnabled |
|
1312 |Qt::ItemIsDragEnabled |
|
1313 |Qt::ItemIsDropEnabled) |
|
1314 { |
|
1315 setData(Qt::DisplayRole, text); |
|
1316 } |
|
1317 |
|
1318 /*! |
|
1319 Constructs a table item with the given \a icon and \a text. |
|
1320 |
|
1321 \sa type() |
|
1322 */ |
|
1323 QTableWidgetItem::QTableWidgetItem(const QIcon &icon, const QString &text, int type) |
|
1324 : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), |
|
1325 itemFlags(Qt::ItemIsEditable |
|
1326 |Qt::ItemIsSelectable |
|
1327 |Qt::ItemIsUserCheckable |
|
1328 |Qt::ItemIsEnabled |
|
1329 |Qt::ItemIsDragEnabled |
|
1330 |Qt::ItemIsDropEnabled) |
|
1331 { |
|
1332 setData(Qt::DecorationRole, icon); |
|
1333 setData(Qt::DisplayRole, text); |
|
1334 } |
|
1335 |
|
1336 /*! |
|
1337 Destroys the table item. |
|
1338 */ |
|
1339 QTableWidgetItem::~QTableWidgetItem() |
|
1340 { |
|
1341 if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) |
|
1342 model->removeItem(this); |
|
1343 view = 0; |
|
1344 delete d; |
|
1345 } |
|
1346 |
|
1347 /*! |
|
1348 Creates a copy of the item. |
|
1349 */ |
|
1350 QTableWidgetItem *QTableWidgetItem::clone() const |
|
1351 { |
|
1352 return new QTableWidgetItem(*this); |
|
1353 } |
|
1354 |
|
1355 /*! |
|
1356 Sets the item's data for the given \a role to the specified \a value. |
|
1357 |
|
1358 \sa Qt::ItemDataRole, data() |
|
1359 */ |
|
1360 void QTableWidgetItem::setData(int role, const QVariant &value) |
|
1361 { |
|
1362 bool found = false; |
|
1363 role = (role == Qt::EditRole ? Qt::DisplayRole : role); |
|
1364 for (int i = 0; i < values.count(); ++i) { |
|
1365 if (values.at(i).role == role) { |
|
1366 if (values[i].value == value) |
|
1367 return; |
|
1368 |
|
1369 values[i].value = value; |
|
1370 found = true; |
|
1371 break; |
|
1372 } |
|
1373 } |
|
1374 if (!found) |
|
1375 values.append(QWidgetItemData(role, value)); |
|
1376 if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) |
|
1377 model->itemChanged(this); |
|
1378 } |
|
1379 |
|
1380 /*! |
|
1381 Returns the item's data for the given \a role. |
|
1382 */ |
|
1383 QVariant QTableWidgetItem::data(int role) const |
|
1384 { |
|
1385 role = (role == Qt::EditRole ? Qt::DisplayRole : role); |
|
1386 for (int i = 0; i < values.count(); ++i) |
|
1387 if (values.at(i).role == role) |
|
1388 return values.at(i).value; |
|
1389 return QVariant(); |
|
1390 } |
|
1391 |
|
1392 /*! |
|
1393 Returns true if the item is less than the \a other item; otherwise returns |
|
1394 false. |
|
1395 */ |
|
1396 bool QTableWidgetItem::operator<(const QTableWidgetItem &other) const |
|
1397 { |
|
1398 const QVariant v1 = data(Qt::DisplayRole), v2 = other.data(Qt::DisplayRole); |
|
1399 return QAbstractItemModelPrivate::variantLessThan(v1, v2); |
|
1400 } |
|
1401 |
|
1402 #ifndef QT_NO_DATASTREAM |
|
1403 |
|
1404 /*! |
|
1405 Reads the item from stream \a in. |
|
1406 |
|
1407 \sa write() |
|
1408 */ |
|
1409 void QTableWidgetItem::read(QDataStream &in) |
|
1410 { |
|
1411 in >> values; |
|
1412 } |
|
1413 |
|
1414 /*! |
|
1415 Writes the item to stream \a out. |
|
1416 |
|
1417 \sa read() |
|
1418 */ |
|
1419 void QTableWidgetItem::write(QDataStream &out) const |
|
1420 { |
|
1421 out << values; |
|
1422 } |
|
1423 |
|
1424 /*! |
|
1425 \relates QTableWidgetItem |
|
1426 |
|
1427 Reads a table widget item from stream \a in into \a item. |
|
1428 |
|
1429 This operator uses QTableWidgetItem::read(). |
|
1430 |
|
1431 \sa {Format of the QDataStream Operators} |
|
1432 */ |
|
1433 QDataStream &operator>>(QDataStream &in, QTableWidgetItem &item) |
|
1434 { |
|
1435 item.read(in); |
|
1436 return in; |
|
1437 } |
|
1438 |
|
1439 /*! |
|
1440 \relates QTableWidgetItem |
|
1441 |
|
1442 Writes the table widget item \a item to stream \a out. |
|
1443 |
|
1444 This operator uses QTableWidgetItem::write(). |
|
1445 |
|
1446 \sa {Format of the QDataStream Operators} |
|
1447 */ |
|
1448 QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item) |
|
1449 { |
|
1450 item.write(out); |
|
1451 return out; |
|
1452 } |
|
1453 |
|
1454 #endif // QT_NO_DATASTREAM |
|
1455 |
|
1456 /*! |
|
1457 \since 4.1 |
|
1458 |
|
1459 Constructs a copy of \a other. Note that type() and tableWidget() |
|
1460 are not copied. |
|
1461 |
|
1462 This function is useful when reimplementing clone(). |
|
1463 |
|
1464 \sa data(), flags() |
|
1465 */ |
|
1466 QTableWidgetItem::QTableWidgetItem(const QTableWidgetItem &other) |
|
1467 : rtti(Type), values(other.values), view(0), |
|
1468 d(new QTableWidgetItemPrivate(this)), |
|
1469 itemFlags(other.itemFlags) |
|
1470 { |
|
1471 } |
|
1472 |
|
1473 /*! |
|
1474 Assigns \a other's data and flags to this item. Note that type() |
|
1475 and tableWidget() are not copied. |
|
1476 |
|
1477 This function is useful when reimplementing clone(). |
|
1478 |
|
1479 \sa data(), flags() |
|
1480 */ |
|
1481 QTableWidgetItem &QTableWidgetItem::operator=(const QTableWidgetItem &other) |
|
1482 { |
|
1483 values = other.values; |
|
1484 itemFlags = other.itemFlags; |
|
1485 return *this; |
|
1486 } |
|
1487 |
|
1488 /*! |
|
1489 \class QTableWidget |
|
1490 \brief The QTableWidget class provides an item-based table view with a default model. |
|
1491 |
|
1492 \ingroup model-view |
|
1493 |
|
1494 |
|
1495 Table widgets provide standard table display facilities for applications. |
|
1496 The items in a QTableWidget are provided by QTableWidgetItem. |
|
1497 |
|
1498 If you want a table that uses your own data model you should |
|
1499 use QTableView rather than this class. |
|
1500 |
|
1501 Table widgets can be constructed with the required numbers of rows and |
|
1502 columns: |
|
1503 |
|
1504 \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 0 |
|
1505 |
|
1506 Alternatively, tables can be constructed without a given size and resized |
|
1507 later: |
|
1508 |
|
1509 \snippet doc/src/snippets/qtablewidget-resizing/mainwindow.cpp 0 |
|
1510 \snippet doc/src/snippets/qtablewidget-resizing/mainwindow.cpp 1 |
|
1511 |
|
1512 Items are created ouside the table (with no parent widget) and inserted |
|
1513 into the table with setItem(): |
|
1514 |
|
1515 \snippet doc/src/snippets/qtablewidget-resizing/mainwindow.cpp 2 |
|
1516 |
|
1517 If you want to enable sorting in your table widget, do so after you |
|
1518 have populated it with items, otherwise sorting may interfere with |
|
1519 the insertion order (see setItem() for details). |
|
1520 |
|
1521 Tables can be given both horizontal and vertical headers. The simplest way |
|
1522 to create the headers is to supply a list of strings to the |
|
1523 setHorizontalHeaderLabels() and setVerticalHeaderLabels() functions. These |
|
1524 will provide simple textual headers for the table's columns and rows. |
|
1525 More sophisticated headers can be created from existing table items |
|
1526 that are usually constructed outside the table. For example, we can |
|
1527 construct a table item with an icon and aligned text, and use it as the |
|
1528 header for a particular column: |
|
1529 |
|
1530 \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 2 |
|
1531 |
|
1532 The number of rows in the table can be found with rowCount(), and the |
|
1533 number of columns with columnCount(). The table can be cleared with the |
|
1534 clear() function. |
|
1535 |
|
1536 \table 100% |
|
1537 \row \o \inlineimage windowsxp-tableview.png Screenshot of a Windows XP style table widget |
|
1538 \o \inlineimage macintosh-tableview.png Screenshot of a Macintosh style table widget |
|
1539 \o \inlineimage plastique-tableview.png Screenshot of a Plastique style table widget |
|
1540 \row \o A \l{Windows XP Style Widget Gallery}{Windows XP style} table widget. |
|
1541 \o A \l{Macintosh Style Widget Gallery}{Macintosh style} table widget. |
|
1542 \o A \l{Plastique Style Widget Gallery}{Plastique style} table widget. |
|
1543 \endtable |
|
1544 |
|
1545 \sa QTableWidgetItem, QTableView, {Model/View Programming} |
|
1546 */ |
|
1547 |
|
1548 /*! |
|
1549 \property QTableWidget::rowCount |
|
1550 \brief the number of rows in the table |
|
1551 |
|
1552 By default, for a table constructed without row and column counts, |
|
1553 this property contains a value of 0. |
|
1554 */ |
|
1555 |
|
1556 /*! |
|
1557 \property QTableWidget::columnCount |
|
1558 \brief the number of columns in the table |
|
1559 |
|
1560 By default, for a table constructed without row and column counts, |
|
1561 this property contains a value of 0. |
|
1562 */ |
|
1563 |
|
1564 void QTableWidgetPrivate::setup() |
|
1565 { |
|
1566 Q_Q(QTableWidget); |
|
1567 // view signals |
|
1568 QObject::connect(q, SIGNAL(pressed(QModelIndex)), q, SLOT(_q_emitItemPressed(QModelIndex))); |
|
1569 QObject::connect(q, SIGNAL(clicked(QModelIndex)), q, SLOT(_q_emitItemClicked(QModelIndex))); |
|
1570 QObject::connect(q, SIGNAL(doubleClicked(QModelIndex)), |
|
1571 q, SLOT(_q_emitItemDoubleClicked(QModelIndex))); |
|
1572 QObject::connect(q, SIGNAL(activated(QModelIndex)), q, SLOT(_q_emitItemActivated(QModelIndex))); |
|
1573 QObject::connect(q, SIGNAL(entered(QModelIndex)), q, SLOT(_q_emitItemEntered(QModelIndex))); |
|
1574 // model signals |
|
1575 QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), |
|
1576 q, SLOT(_q_emitItemChanged(QModelIndex))); |
|
1577 // selection signals |
|
1578 QObject::connect(q->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), |
|
1579 q, SLOT(_q_emitCurrentItemChanged(QModelIndex,QModelIndex))); |
|
1580 QObject::connect(q->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), |
|
1581 q, SIGNAL(itemSelectionChanged())); |
|
1582 // sorting |
|
1583 QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), |
|
1584 q, SLOT(_q_dataChanged(QModelIndex,QModelIndex))); |
|
1585 QObject::connect(model, SIGNAL(columnsRemoved(QModelIndex,int,int)), q, SLOT(_q_sort())); |
|
1586 } |
|
1587 |
|
1588 void QTableWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) |
|
1589 { |
|
1590 Q_Q(QTableWidget); |
|
1591 if (QTableWidgetItem *item = tableModel()->item(index)) |
|
1592 emit q->itemPressed(item); |
|
1593 emit q->cellPressed(index.row(), index.column()); |
|
1594 } |
|
1595 |
|
1596 void QTableWidgetPrivate::_q_emitItemClicked(const QModelIndex &index) |
|
1597 { |
|
1598 Q_Q(QTableWidget); |
|
1599 if (QTableWidgetItem *item = tableModel()->item(index)) |
|
1600 emit q->itemClicked(item); |
|
1601 emit q->cellClicked(index.row(), index.column()); |
|
1602 } |
|
1603 |
|
1604 void QTableWidgetPrivate::_q_emitItemDoubleClicked(const QModelIndex &index) |
|
1605 { |
|
1606 Q_Q(QTableWidget); |
|
1607 if (QTableWidgetItem *item = tableModel()->item(index)) |
|
1608 emit q->itemDoubleClicked(item); |
|
1609 emit q->cellDoubleClicked(index.row(), index.column()); |
|
1610 } |
|
1611 |
|
1612 void QTableWidgetPrivate::_q_emitItemActivated(const QModelIndex &index) |
|
1613 { |
|
1614 Q_Q(QTableWidget); |
|
1615 if (QTableWidgetItem *item = tableModel()->item(index)) |
|
1616 emit q->itemActivated(item); |
|
1617 emit q->cellActivated(index.row(), index.column()); |
|
1618 } |
|
1619 |
|
1620 void QTableWidgetPrivate::_q_emitItemEntered(const QModelIndex &index) |
|
1621 { |
|
1622 Q_Q(QTableWidget); |
|
1623 if (QTableWidgetItem *item = tableModel()->item(index)) |
|
1624 emit q->itemEntered(item); |
|
1625 emit q->cellEntered(index.row(), index.column()); |
|
1626 } |
|
1627 |
|
1628 void QTableWidgetPrivate::_q_emitItemChanged(const QModelIndex &index) |
|
1629 { |
|
1630 Q_Q(QTableWidget); |
|
1631 if (QTableWidgetItem *item = tableModel()->item(index)) |
|
1632 emit q->itemChanged(item); |
|
1633 emit q->cellChanged(index.row(), index.column()); |
|
1634 } |
|
1635 |
|
1636 void QTableWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, |
|
1637 const QModelIndex &previous) |
|
1638 { |
|
1639 Q_Q(QTableWidget); |
|
1640 QTableWidgetItem *currentItem = tableModel()->item(current); |
|
1641 QTableWidgetItem *previousItem = tableModel()->item(previous); |
|
1642 if (currentItem || previousItem) |
|
1643 emit q->currentItemChanged(currentItem, previousItem); |
|
1644 emit q->currentCellChanged(current.row(), current.column(), previous.row(), previous.column()); |
|
1645 } |
|
1646 |
|
1647 void QTableWidgetPrivate::_q_sort() |
|
1648 { |
|
1649 if (sortingEnabled) { |
|
1650 int column = horizontalHeader->sortIndicatorSection(); |
|
1651 Qt::SortOrder order = horizontalHeader->sortIndicatorOrder(); |
|
1652 model->sort(column, order); |
|
1653 } |
|
1654 } |
|
1655 |
|
1656 void QTableWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, |
|
1657 const QModelIndex &bottomRight) |
|
1658 { |
|
1659 if (sortingEnabled && topLeft.isValid() && bottomRight.isValid()) { |
|
1660 int column = horizontalHeader->sortIndicatorSection(); |
|
1661 if (column >= topLeft.column() && column <= bottomRight.column()) { |
|
1662 Qt::SortOrder order = horizontalHeader->sortIndicatorOrder(); |
|
1663 tableModel()->ensureSorted(column, order, topLeft.row(), bottomRight.row()); |
|
1664 } |
|
1665 } |
|
1666 } |
|
1667 |
|
1668 /*! |
|
1669 \fn void QTableWidget::itemPressed(QTableWidgetItem *item) |
|
1670 |
|
1671 This signal is emitted whenever an item in the table is pressed. |
|
1672 The \a item specified is the item that was pressed. |
|
1673 */ |
|
1674 |
|
1675 /*! |
|
1676 \fn void QTableWidget::itemClicked(QTableWidgetItem *item) |
|
1677 |
|
1678 This signal is emitted whenever an item in the table is clicked. |
|
1679 The \a item specified is the item that was clicked. |
|
1680 */ |
|
1681 |
|
1682 /*! |
|
1683 \fn void QTableWidget::itemDoubleClicked(QTableWidgetItem *item) |
|
1684 |
|
1685 This signal is emitted whenever an item in the table is double |
|
1686 clicked. The \a item specified is the item that was double clicked. |
|
1687 */ |
|
1688 |
|
1689 /*! |
|
1690 \fn void QTableWidget::itemActivated(QTableWidgetItem *item) |
|
1691 |
|
1692 This signal is emitted when the specified \a item has been activated |
|
1693 */ |
|
1694 |
|
1695 /*! |
|
1696 \fn void QTableWidget::itemEntered(QTableWidgetItem *item) |
|
1697 |
|
1698 This signal is emitted when the mouse cursor enters an item. The |
|
1699 \a item is the item entered. |
|
1700 |
|
1701 This signal is only emitted when mouseTracking is turned on, or when a |
|
1702 mouse button is pressed while moving into an item. |
|
1703 */ |
|
1704 |
|
1705 /*! |
|
1706 \fn void QTableWidget::itemChanged(QTableWidgetItem *item) |
|
1707 |
|
1708 This signal is emitted whenever the data of \a item has changed. |
|
1709 */ |
|
1710 |
|
1711 /*! |
|
1712 \fn void QTableWidget::currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) |
|
1713 |
|
1714 This signal is emitted whenever the current item changes. The \a |
|
1715 previous item is the item that previously had the focus, \a |
|
1716 current is the new current item. |
|
1717 */ |
|
1718 |
|
1719 /*! |
|
1720 \fn void QTableWidget::itemSelectionChanged() |
|
1721 |
|
1722 This signal is emitted whenever the selection changes. |
|
1723 |
|
1724 \sa selectedItems() QTableWidgetItem::isSelected() |
|
1725 */ |
|
1726 |
|
1727 |
|
1728 /*! |
|
1729 \since 4.1 |
|
1730 \fn void QTableWidget::cellPressed(int row, int column) |
|
1731 |
|
1732 This signal is emitted whenever a cell in the table is pressed. |
|
1733 The \a row and \a column specified is the cell that was pressed. |
|
1734 */ |
|
1735 |
|
1736 /*! |
|
1737 \since 4.1 |
|
1738 \fn void QTableWidget::cellClicked(int row, int column) |
|
1739 |
|
1740 This signal is emitted whenever a cell in the table is clicked. |
|
1741 The \a row and \a column specified is the cell that was clicked. |
|
1742 */ |
|
1743 |
|
1744 /*! |
|
1745 \since 4.1 |
|
1746 \fn void QTableWidget::cellDoubleClicked(int row, int column) |
|
1747 |
|
1748 This signal is emitted whenever a cell in the table is double |
|
1749 clicked. The \a row and \a column specified is the cell that was |
|
1750 double clicked. |
|
1751 */ |
|
1752 |
|
1753 /*! |
|
1754 \since 4.1 |
|
1755 \fn void QTableWidget::cellActivated(int row, int column) |
|
1756 |
|
1757 This signal is emitted when the cell specified by \a row and \a column |
|
1758 has been activated |
|
1759 */ |
|
1760 |
|
1761 /*! |
|
1762 \since 4.1 |
|
1763 \fn void QTableWidget::cellEntered(int row, int column) |
|
1764 |
|
1765 This signal is emitted when the mouse cursor enters a cell. The |
|
1766 cell is specified by \a row and \a column. |
|
1767 |
|
1768 This signal is only emitted when mouseTracking is turned on, or when a |
|
1769 mouse button is pressed while moving into an item. |
|
1770 */ |
|
1771 |
|
1772 /*! |
|
1773 \since 4.1 |
|
1774 \fn void QTableWidget::cellChanged(int row, int column) |
|
1775 |
|
1776 This signal is emitted whenever the data of the item in the cell |
|
1777 specified by \a row and \a column has changed. |
|
1778 */ |
|
1779 |
|
1780 /*! |
|
1781 \since 4.1 |
|
1782 \fn void QTableWidget::currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) |
|
1783 |
|
1784 This signal is emitted whenever the current cell changes. The cell |
|
1785 specified by \a previousRow and \a previousColumn is the cell that |
|
1786 previously had the focus, the cell specified by \a currentRow and \a |
|
1787 currentColumn is the new current cell. |
|
1788 */ |
|
1789 |
|
1790 /*! |
|
1791 \since 4.3 |
|
1792 \fn void QTableWidget::removeCellWidget(int row, int column) |
|
1793 |
|
1794 Removes the widget set on the cell indicated by \a row and \a column. |
|
1795 */ |
|
1796 |
|
1797 /*! |
|
1798 \fn QTableWidgetItem *QTableWidget::itemAt(int ax, int ay) const |
|
1799 |
|
1800 Returns the item at the position equivalent to QPoint(\a{ax}, \a{ay}) in |
|
1801 the table widget's coordinate system, or returns 0 if the specified point |
|
1802 is not covered by an item in the table widget. |
|
1803 |
|
1804 \sa item() |
|
1805 */ |
|
1806 |
|
1807 /*! |
|
1808 \enum QTableWidgetItem::ItemType |
|
1809 |
|
1810 This enum describes the types that are used to describe table widget items. |
|
1811 |
|
1812 \value Type The default type for table widget items. |
|
1813 \value UserType The minimum value for custom types. Values below UserType are |
|
1814 reserved by Qt. |
|
1815 |
|
1816 You can define new user types in QTableWidgetItem subclasses to ensure that |
|
1817 custom items are treated specially. |
|
1818 |
|
1819 \sa type() |
|
1820 */ |
|
1821 |
|
1822 /*! |
|
1823 \fn int QTableWidgetItem::type() const |
|
1824 |
|
1825 Returns the type passed to the QTableWidgetItem constructor. |
|
1826 */ |
|
1827 |
|
1828 /*! |
|
1829 Creates a new table view with the given \a parent. |
|
1830 */ |
|
1831 QTableWidget::QTableWidget(QWidget *parent) |
|
1832 : QTableView(*new QTableWidgetPrivate, parent) |
|
1833 { |
|
1834 Q_D(QTableWidget); |
|
1835 QTableView::setModel(new QTableModel(0, 0, this)); |
|
1836 d->setup(); |
|
1837 } |
|
1838 |
|
1839 /*! |
|
1840 Creates a new table view with the given \a rows and \a columns, and with the given \a parent. |
|
1841 */ |
|
1842 QTableWidget::QTableWidget(int rows, int columns, QWidget *parent) |
|
1843 : QTableView(*new QTableWidgetPrivate, parent) |
|
1844 { |
|
1845 Q_D(QTableWidget); |
|
1846 QTableView::setModel(new QTableModel(rows, columns, this)); |
|
1847 d->setup(); |
|
1848 } |
|
1849 |
|
1850 /*! |
|
1851 Destroys this QTableWidget. |
|
1852 */ |
|
1853 QTableWidget::~QTableWidget() |
|
1854 { |
|
1855 } |
|
1856 |
|
1857 /*! |
|
1858 Sets the number of rows in this table's model to \a rows. If |
|
1859 this is less than rowCount(), the data in the unwanted rows |
|
1860 is discarded. |
|
1861 |
|
1862 \sa setColumnCount() |
|
1863 */ |
|
1864 void QTableWidget::setRowCount(int rows) |
|
1865 { |
|
1866 Q_D(QTableWidget); |
|
1867 d->tableModel()->setRowCount(rows); |
|
1868 } |
|
1869 |
|
1870 /*! |
|
1871 Returns the number of rows. |
|
1872 */ |
|
1873 |
|
1874 int QTableWidget::rowCount() const |
|
1875 { |
|
1876 Q_D(const QTableWidget); |
|
1877 return d->model->rowCount(); |
|
1878 } |
|
1879 |
|
1880 /*! |
|
1881 Sets the number of columns in this table's model to \a columns. If |
|
1882 this is less than columnCount(), the data in the unwanted columns |
|
1883 is discarded. |
|
1884 |
|
1885 \sa setRowCount() |
|
1886 */ |
|
1887 void QTableWidget::setColumnCount(int columns) |
|
1888 { |
|
1889 Q_D(QTableWidget); |
|
1890 d->tableModel()->setColumnCount(columns); |
|
1891 } |
|
1892 |
|
1893 /*! |
|
1894 Returns the number of columns. |
|
1895 */ |
|
1896 |
|
1897 int QTableWidget::columnCount() const |
|
1898 { |
|
1899 Q_D(const QTableWidget); |
|
1900 return d->model->columnCount(); |
|
1901 } |
|
1902 |
|
1903 /*! |
|
1904 Returns the row for the \a item. |
|
1905 */ |
|
1906 int QTableWidget::row(const QTableWidgetItem *item) const |
|
1907 { |
|
1908 Q_D(const QTableWidget); |
|
1909 return d->tableModel()->index(item).row(); |
|
1910 } |
|
1911 |
|
1912 /*! |
|
1913 Returns the column for the \a item. |
|
1914 */ |
|
1915 int QTableWidget::column(const QTableWidgetItem *item) const |
|
1916 { |
|
1917 Q_D(const QTableWidget); |
|
1918 return d->tableModel()->index(item).column(); |
|
1919 } |
|
1920 |
|
1921 |
|
1922 /*! |
|
1923 Returns the item for the given \a row and \a column if one has been set; otherwise |
|
1924 returns 0. |
|
1925 |
|
1926 \sa setItem() |
|
1927 */ |
|
1928 QTableWidgetItem *QTableWidget::item(int row, int column) const |
|
1929 { |
|
1930 Q_D(const QTableWidget); |
|
1931 return d->tableModel()->item(row, column); |
|
1932 } |
|
1933 |
|
1934 /*! |
|
1935 Sets the item for the given \a row and \a column to \a item. |
|
1936 |
|
1937 The table takes ownership of the item. |
|
1938 |
|
1939 Note that if sorting is enabled (see |
|
1940 \l{QTableView::sortingEnabled} {sortingEnabled}) and \a column is |
|
1941 the current sort column, the \a row will be moved to the sorted |
|
1942 position determined by \a item. |
|
1943 |
|
1944 If you want to set several items of a particular row (say, by |
|
1945 calling setItem() in a loop), you may want to turn off sorting |
|
1946 before doing so, and turn it back on afterwards; this will allow |
|
1947 you to use the same \a row argument for all items in the same row |
|
1948 (i.e. setItem() will not move the row). |
|
1949 |
|
1950 \sa item() takeItem() |
|
1951 */ |
|
1952 void QTableWidget::setItem(int row, int column, QTableWidgetItem *item) |
|
1953 { |
|
1954 Q_D(QTableWidget); |
|
1955 if (item) { |
|
1956 if (item->view != 0) { |
|
1957 qWarning("QTableWidget: cannot insert an item that is already owned by another QTableWidget"); |
|
1958 } else { |
|
1959 item->view = this; |
|
1960 d->tableModel()->setItem(row, column, item); |
|
1961 } |
|
1962 } else { |
|
1963 delete takeItem(row, column); |
|
1964 } |
|
1965 } |
|
1966 |
|
1967 /*! |
|
1968 Removes the item at \a row and \a column from the table without deleting it. |
|
1969 */ |
|
1970 QTableWidgetItem *QTableWidget::takeItem(int row, int column) |
|
1971 { |
|
1972 Q_D(QTableWidget); |
|
1973 QTableWidgetItem *item = d->tableModel()->takeItem(row, column); |
|
1974 if (item) |
|
1975 item->view = 0; |
|
1976 return item; |
|
1977 } |
|
1978 |
|
1979 /*! |
|
1980 Returns the vertical header item for row \a row. |
|
1981 */ |
|
1982 QTableWidgetItem *QTableWidget::verticalHeaderItem(int row) const |
|
1983 { |
|
1984 Q_D(const QTableWidget); |
|
1985 return d->tableModel()->verticalHeaderItem(row); |
|
1986 } |
|
1987 |
|
1988 /*! |
|
1989 Sets the vertical header item for row \a row to \a item. |
|
1990 */ |
|
1991 void QTableWidget::setVerticalHeaderItem(int row, QTableWidgetItem *item) |
|
1992 { |
|
1993 Q_D(QTableWidget); |
|
1994 if (item) { |
|
1995 item->view = this; |
|
1996 d->tableModel()->setVerticalHeaderItem(row, item); |
|
1997 } else { |
|
1998 delete takeVerticalHeaderItem(row); |
|
1999 } |
|
2000 } |
|
2001 |
|
2002 /*! |
|
2003 \since 4.1 |
|
2004 Removes the vertical header item at \a row from the header without deleting it. |
|
2005 */ |
|
2006 QTableWidgetItem *QTableWidget::takeVerticalHeaderItem(int row) |
|
2007 { |
|
2008 Q_D(QTableWidget); |
|
2009 QTableWidgetItem *itm = d->tableModel()->takeVerticalHeaderItem(row); |
|
2010 if (itm) |
|
2011 itm->view = 0; |
|
2012 return itm; |
|
2013 } |
|
2014 |
|
2015 /*! |
|
2016 Returns the horizontal header item for column, \a column, if one has been |
|
2017 set; otherwise returns 0. |
|
2018 */ |
|
2019 QTableWidgetItem *QTableWidget::horizontalHeaderItem(int column) const |
|
2020 { |
|
2021 Q_D(const QTableWidget); |
|
2022 return d->tableModel()->horizontalHeaderItem(column); |
|
2023 } |
|
2024 |
|
2025 /*! |
|
2026 Sets the horizontal header item for column \a column to \a item. |
|
2027 */ |
|
2028 void QTableWidget::setHorizontalHeaderItem(int column, QTableWidgetItem *item) |
|
2029 { |
|
2030 Q_D(QTableWidget); |
|
2031 if (item) { |
|
2032 item->view = this; |
|
2033 d->tableModel()->setHorizontalHeaderItem(column, item); |
|
2034 } else { |
|
2035 delete takeHorizontalHeaderItem(column); |
|
2036 } |
|
2037 } |
|
2038 |
|
2039 /*! |
|
2040 \since 4.1 |
|
2041 Removes the horizontal header item at \a column from the header without deleting it. |
|
2042 */ |
|
2043 QTableWidgetItem *QTableWidget::takeHorizontalHeaderItem(int column) |
|
2044 { |
|
2045 Q_D(QTableWidget); |
|
2046 QTableWidgetItem *itm = d->tableModel()->takeHorizontalHeaderItem(column); |
|
2047 if (itm) |
|
2048 itm->view = 0; |
|
2049 return itm; |
|
2050 } |
|
2051 |
|
2052 /*! |
|
2053 Sets the vertical header labels using \a labels. |
|
2054 */ |
|
2055 void QTableWidget::setVerticalHeaderLabels(const QStringList &labels) |
|
2056 { |
|
2057 Q_D(QTableWidget); |
|
2058 QTableModel *model = d->tableModel(); |
|
2059 QTableWidgetItem *item = 0; |
|
2060 for (int i = 0; i < model->rowCount() && i < labels.count(); ++i) { |
|
2061 item = model->verticalHeaderItem(i); |
|
2062 if (!item) { |
|
2063 item = model->createItem(); |
|
2064 setVerticalHeaderItem(i, item); |
|
2065 } |
|
2066 item->setText(labels.at(i)); |
|
2067 } |
|
2068 } |
|
2069 |
|
2070 /*! |
|
2071 Sets the horizontal header labels using \a labels. |
|
2072 */ |
|
2073 void QTableWidget::setHorizontalHeaderLabels(const QStringList &labels) |
|
2074 { |
|
2075 Q_D(QTableWidget); |
|
2076 QTableModel *model = d->tableModel(); |
|
2077 QTableWidgetItem *item = 0; |
|
2078 for (int i = 0; i < model->columnCount() && i < labels.count(); ++i) { |
|
2079 item = model->horizontalHeaderItem(i); |
|
2080 if (!item) { |
|
2081 item = model->createItem(); |
|
2082 setHorizontalHeaderItem(i, item); |
|
2083 } |
|
2084 item->setText(labels.at(i)); |
|
2085 } |
|
2086 } |
|
2087 |
|
2088 /*! |
|
2089 Returns the row of the current item. |
|
2090 |
|
2091 \sa currentColumn(), setCurrentCell() |
|
2092 */ |
|
2093 int QTableWidget::currentRow() const |
|
2094 { |
|
2095 return currentIndex().row(); |
|
2096 } |
|
2097 |
|
2098 /*! |
|
2099 Returns the column of the current item. |
|
2100 |
|
2101 \sa currentRow(), setCurrentCell() |
|
2102 */ |
|
2103 int QTableWidget::currentColumn() const |
|
2104 { |
|
2105 return currentIndex().column(); |
|
2106 } |
|
2107 |
|
2108 /*! |
|
2109 Returns the current item. |
|
2110 |
|
2111 \sa setCurrentItem() |
|
2112 */ |
|
2113 QTableWidgetItem *QTableWidget::currentItem() const |
|
2114 { |
|
2115 Q_D(const QTableWidget); |
|
2116 return d->tableModel()->item(currentIndex()); |
|
2117 } |
|
2118 |
|
2119 /*! |
|
2120 Sets the current item to \a item. |
|
2121 |
|
2122 Unless the selection mode is \l{QAbstractItemView::}{NoSelection}, |
|
2123 the item is also be selected. |
|
2124 |
|
2125 \sa currentItem(), setCurrentCell() |
|
2126 */ |
|
2127 void QTableWidget::setCurrentItem(QTableWidgetItem *item) |
|
2128 { |
|
2129 Q_D(QTableWidget); |
|
2130 setCurrentIndex(d->tableModel()->index(item)); |
|
2131 } |
|
2132 |
|
2133 /*! |
|
2134 \since 4.4 |
|
2135 |
|
2136 Sets the current item to be \a item, using the given \a command. |
|
2137 |
|
2138 \sa currentItem(), setCurrentCell() |
|
2139 */ |
|
2140 void QTableWidget::setCurrentItem(QTableWidgetItem *item, QItemSelectionModel::SelectionFlags command) |
|
2141 { |
|
2142 Q_D(QTableWidget); |
|
2143 d->selectionModel->setCurrentIndex(d->tableModel()->index(item), command); |
|
2144 } |
|
2145 |
|
2146 /*! |
|
2147 \since 4.1 |
|
2148 |
|
2149 Sets the current cell to be the cell at position (\a row, \a |
|
2150 column). |
|
2151 |
|
2152 Depending on the current \l{QAbstractItemView::SelectionMode}{selection mode}, |
|
2153 the cell may also be selected. |
|
2154 |
|
2155 \sa setCurrentItem(), currentRow(), currentColumn() |
|
2156 */ |
|
2157 void QTableWidget::setCurrentCell(int row, int column) |
|
2158 { |
|
2159 setCurrentIndex(model()->index(row, column, QModelIndex())); |
|
2160 } |
|
2161 |
|
2162 /*! |
|
2163 \since 4.4 |
|
2164 |
|
2165 Sets the current cell to be the cell at position (\a row, \a |
|
2166 column), using the given \a command. |
|
2167 |
|
2168 \sa setCurrentItem(), currentRow(), currentColumn() |
|
2169 */ |
|
2170 void QTableWidget::setCurrentCell(int row, int column, QItemSelectionModel::SelectionFlags command) |
|
2171 { |
|
2172 Q_D(QTableWidget); |
|
2173 d->selectionModel->setCurrentIndex(model()->index(row, column, QModelIndex()), command); |
|
2174 } |
|
2175 |
|
2176 /*! |
|
2177 Sorts all the rows in the table widget based on \a column and \a order. |
|
2178 */ |
|
2179 void QTableWidget::sortItems(int column, Qt::SortOrder order) |
|
2180 { |
|
2181 Q_D(QTableWidget); |
|
2182 d->model->sort(column, order); |
|
2183 horizontalHeader()->setSortIndicator(column, order); |
|
2184 } |
|
2185 |
|
2186 /*! |
|
2187 \internal |
|
2188 */ |
|
2189 void QTableWidget::setSortingEnabled(bool enable) |
|
2190 { |
|
2191 QTableView::setSortingEnabled(enable); |
|
2192 } |
|
2193 |
|
2194 /*! |
|
2195 \internal |
|
2196 */ |
|
2197 bool QTableWidget::isSortingEnabled() const |
|
2198 { |
|
2199 return QTableView::isSortingEnabled(); |
|
2200 } |
|
2201 |
|
2202 /*! |
|
2203 Starts editing the \a item if it is editable. |
|
2204 */ |
|
2205 |
|
2206 void QTableWidget::editItem(QTableWidgetItem *item) |
|
2207 { |
|
2208 Q_D(QTableWidget); |
|
2209 if (!item) |
|
2210 return; |
|
2211 edit(d->tableModel()->index(item)); |
|
2212 } |
|
2213 |
|
2214 /*! |
|
2215 Opens an editor for the give \a item. The editor remains open after editing. |
|
2216 |
|
2217 \sa closePersistentEditor() |
|
2218 */ |
|
2219 void QTableWidget::openPersistentEditor(QTableWidgetItem *item) |
|
2220 { |
|
2221 Q_D(QTableWidget); |
|
2222 if (!item) |
|
2223 return; |
|
2224 QModelIndex index = d->tableModel()->index(item); |
|
2225 QAbstractItemView::openPersistentEditor(index); |
|
2226 } |
|
2227 |
|
2228 /*! |
|
2229 Closes the persistent editor for \a item. |
|
2230 |
|
2231 \sa openPersistentEditor() |
|
2232 */ |
|
2233 void QTableWidget::closePersistentEditor(QTableWidgetItem *item) |
|
2234 { |
|
2235 Q_D(QTableWidget); |
|
2236 if (!item) |
|
2237 return; |
|
2238 QModelIndex index = d->tableModel()->index(item); |
|
2239 QAbstractItemView::closePersistentEditor(index); |
|
2240 } |
|
2241 |
|
2242 /*! |
|
2243 \since 4.1 |
|
2244 |
|
2245 Returns the widget displayed in the cell in the given \a row and \a column. |
|
2246 |
|
2247 \note The table takes ownership of the widget. |
|
2248 |
|
2249 \sa setCellWidget() |
|
2250 */ |
|
2251 QWidget *QTableWidget::cellWidget(int row, int column) const |
|
2252 { |
|
2253 QModelIndex index = model()->index(row, column, QModelIndex()); |
|
2254 return QAbstractItemView::indexWidget(index); |
|
2255 } |
|
2256 |
|
2257 /*! |
|
2258 \since 4.1 |
|
2259 |
|
2260 Sets the given \a widget to be displayed in the cell in the given \a row |
|
2261 and \a column, passing the ownership of the widget to the table. |
|
2262 |
|
2263 If cell widget A is replaced with cell widget B, cell widget A will be |
|
2264 deleted. For example, in the code snippet below, the QLineEdit object will |
|
2265 be deleted. |
|
2266 |
|
2267 \snippet doc/src/snippets/code/src_gui_itemviews_qtablewidget.cpp 0 |
|
2268 |
|
2269 \sa cellWidget() |
|
2270 */ |
|
2271 void QTableWidget::setCellWidget(int row, int column, QWidget *widget) |
|
2272 { |
|
2273 QModelIndex index = model()->index(row, column, QModelIndex()); |
|
2274 QAbstractItemView::setIndexWidget(index, widget); |
|
2275 } |
|
2276 |
|
2277 /*! |
|
2278 Returns true if the \a item is selected, otherwise returns false. |
|
2279 |
|
2280 \obsolete |
|
2281 |
|
2282 This function is deprecated. Use \l{QTableWidgetItem::isSelected()} instead. |
|
2283 */ |
|
2284 |
|
2285 bool QTableWidget::isItemSelected(const QTableWidgetItem *item) const |
|
2286 { |
|
2287 Q_D(const QTableWidget); |
|
2288 QModelIndex index = d->tableModel()->index(item); |
|
2289 return selectionModel()->isSelected(index); |
|
2290 } |
|
2291 |
|
2292 /*! |
|
2293 Selects or deselects \a item depending on \a select. |
|
2294 |
|
2295 \obsolete |
|
2296 |
|
2297 This function is deprecated. Use \l{QTableWidgetItem::setSelected()} instead. |
|
2298 */ |
|
2299 void QTableWidget::setItemSelected(const QTableWidgetItem *item, bool select) |
|
2300 { |
|
2301 Q_D(QTableWidget); |
|
2302 QModelIndex index = d->tableModel()->index(item); |
|
2303 selectionModel()->select(index, select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); |
|
2304 } |
|
2305 |
|
2306 /*! |
|
2307 Selects or deselects the \a range depending on \a select. |
|
2308 */ |
|
2309 void QTableWidget::setRangeSelected(const QTableWidgetSelectionRange &range, bool select) |
|
2310 { |
|
2311 if (!model()->hasIndex(range.topRow(), range.leftColumn(), rootIndex()) || |
|
2312 !model()->hasIndex(range.bottomRow(), range.rightColumn(), rootIndex())) |
|
2313 return; |
|
2314 |
|
2315 QModelIndex topLeft = model()->index(range.topRow(), range.leftColumn(), rootIndex()); |
|
2316 QModelIndex bottomRight = model()->index(range.bottomRow(), range.rightColumn(), rootIndex()); |
|
2317 |
|
2318 selectionModel()->select(QItemSelection(topLeft, bottomRight), |
|
2319 select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); |
|
2320 } |
|
2321 |
|
2322 /*! |
|
2323 Returns a list of all selected ranges. |
|
2324 |
|
2325 \sa QTableWidgetSelectionRange |
|
2326 */ |
|
2327 |
|
2328 QList<QTableWidgetSelectionRange> QTableWidget::selectedRanges() const |
|
2329 { |
|
2330 const QList<QItemSelectionRange> ranges = selectionModel()->selection(); |
|
2331 QList<QTableWidgetSelectionRange> result; |
|
2332 for (int i = 0; i < ranges.count(); ++i) |
|
2333 result.append(QTableWidgetSelectionRange(ranges.at(i).top(), |
|
2334 ranges.at(i).left(), |
|
2335 ranges.at(i).bottom(), |
|
2336 ranges.at(i).right())); |
|
2337 return result; |
|
2338 } |
|
2339 |
|
2340 /*! |
|
2341 Returns a list of all selected items. |
|
2342 |
|
2343 This function returns a list of pointers to the contents of the |
|
2344 selected cells. Use the selectedIndexes() function to retrieve the |
|
2345 complete selection \e including empty cells. |
|
2346 |
|
2347 \sa selectedIndexes() |
|
2348 */ |
|
2349 |
|
2350 QList<QTableWidgetItem*> QTableWidget::selectedItems() |
|
2351 { |
|
2352 Q_D(QTableWidget); |
|
2353 QModelIndexList indexes = selectionModel()->selectedIndexes(); |
|
2354 QList<QTableWidgetItem*> items; |
|
2355 for (int i = 0; i < indexes.count(); ++i) { |
|
2356 QModelIndex index = indexes.at(i); |
|
2357 if (isIndexHidden(index)) |
|
2358 continue; |
|
2359 QTableWidgetItem *item = d->tableModel()->item(index); |
|
2360 if (item) |
|
2361 items.append(item); |
|
2362 } |
|
2363 return items; |
|
2364 } |
|
2365 |
|
2366 /*! |
|
2367 Finds items that matches the \a text using the given \a flags. |
|
2368 */ |
|
2369 |
|
2370 QList<QTableWidgetItem*> QTableWidget::findItems(const QString &text, Qt::MatchFlags flags) const |
|
2371 { |
|
2372 Q_D(const QTableWidget); |
|
2373 QModelIndexList indexes; |
|
2374 for (int column = 0; column < columnCount(); ++column) |
|
2375 indexes += d->model->match(model()->index(0, column, QModelIndex()), |
|
2376 Qt::DisplayRole, text, -1, flags); |
|
2377 QList<QTableWidgetItem*> items; |
|
2378 for (int i = 0; i < indexes.size(); ++i) |
|
2379 items.append(d->tableModel()->item(indexes.at(i))); |
|
2380 return items; |
|
2381 } |
|
2382 |
|
2383 /*! |
|
2384 Returns the visual row of the given \a logicalRow. |
|
2385 */ |
|
2386 |
|
2387 int QTableWidget::visualRow(int logicalRow) const |
|
2388 { |
|
2389 return verticalHeader()->visualIndex(logicalRow); |
|
2390 } |
|
2391 |
|
2392 /*! |
|
2393 Returns the visual column of the given \a logicalColumn. |
|
2394 */ |
|
2395 |
|
2396 int QTableWidget::visualColumn(int logicalColumn) const |
|
2397 { |
|
2398 return horizontalHeader()->visualIndex(logicalColumn); |
|
2399 } |
|
2400 |
|
2401 /*! |
|
2402 \fn QTableWidgetItem *QTableWidget::itemAt(const QPoint &point) const |
|
2403 |
|
2404 Returns a pointer to the item at the given \a point, or returns 0 if |
|
2405 \a point is not covered by an item in the table widget. |
|
2406 |
|
2407 \sa item() |
|
2408 */ |
|
2409 |
|
2410 QTableWidgetItem *QTableWidget::itemAt(const QPoint &p) const |
|
2411 { |
|
2412 Q_D(const QTableWidget); |
|
2413 return d->tableModel()->item(indexAt(p)); |
|
2414 } |
|
2415 |
|
2416 /*! |
|
2417 Returns the rectangle on the viewport occupied by the item at \a item. |
|
2418 */ |
|
2419 QRect QTableWidget::visualItemRect(const QTableWidgetItem *item) const |
|
2420 { |
|
2421 Q_D(const QTableWidget); |
|
2422 if (!item) |
|
2423 return QRect(); |
|
2424 QModelIndex index = d->tableModel()->index(const_cast<QTableWidgetItem*>(item)); |
|
2425 Q_ASSERT(index.isValid()); |
|
2426 return visualRect(index); |
|
2427 } |
|
2428 |
|
2429 /*! |
|
2430 Scrolls the view if necessary to ensure that the \a item is visible. |
|
2431 The \a hint parameter specifies more precisely where the |
|
2432 \a item should be located after the operation. |
|
2433 */ |
|
2434 |
|
2435 void QTableWidget::scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint) |
|
2436 { |
|
2437 Q_D(QTableWidget); |
|
2438 if (!item) |
|
2439 return; |
|
2440 QModelIndex index = d->tableModel()->index(const_cast<QTableWidgetItem*>(item)); |
|
2441 Q_ASSERT(index.isValid()); |
|
2442 QTableView::scrollTo(index, hint); |
|
2443 } |
|
2444 |
|
2445 /*! |
|
2446 Returns the item prototype used by the table. |
|
2447 |
|
2448 \sa setItemPrototype() |
|
2449 */ |
|
2450 const QTableWidgetItem *QTableWidget::itemPrototype() const |
|
2451 { |
|
2452 Q_D(const QTableWidget); |
|
2453 return d->tableModel()->itemPrototype(); |
|
2454 } |
|
2455 |
|
2456 /*! |
|
2457 Sets the item prototype for the table to the specified \a item. |
|
2458 |
|
2459 The table widget will use the item prototype clone function when it needs |
|
2460 to create a new table item. For example when the user is editing |
|
2461 editing in an empty cell. This is useful when you have a QTableWidgetItem |
|
2462 subclass and want to make sure that QTableWidget creates instances of |
|
2463 your subclass. |
|
2464 |
|
2465 The table takes ownership of the prototype. |
|
2466 |
|
2467 \sa itemPrototype() |
|
2468 */ |
|
2469 void QTableWidget::setItemPrototype(const QTableWidgetItem *item) |
|
2470 { |
|
2471 Q_D(QTableWidget); |
|
2472 d->tableModel()->setItemPrototype(item); |
|
2473 } |
|
2474 |
|
2475 /*! |
|
2476 Inserts an empty row into the table at \a row. |
|
2477 */ |
|
2478 void QTableWidget::insertRow(int row) |
|
2479 { |
|
2480 Q_D(QTableWidget); |
|
2481 d->tableModel()->insertRows(row); |
|
2482 } |
|
2483 |
|
2484 /*! |
|
2485 Inserts an empty column into the table at \a column. |
|
2486 */ |
|
2487 void QTableWidget::insertColumn(int column) |
|
2488 { |
|
2489 Q_D(QTableWidget); |
|
2490 d->tableModel()->insertColumns(column); |
|
2491 } |
|
2492 |
|
2493 /*! |
|
2494 Removes the row \a row and all its items from the table. |
|
2495 */ |
|
2496 void QTableWidget::removeRow(int row) |
|
2497 { |
|
2498 Q_D(QTableWidget); |
|
2499 d->tableModel()->removeRows(row); |
|
2500 } |
|
2501 |
|
2502 /*! |
|
2503 Removes the column \a column and all its items from the table. |
|
2504 */ |
|
2505 void QTableWidget::removeColumn(int column) |
|
2506 { |
|
2507 Q_D(QTableWidget); |
|
2508 d->tableModel()->removeColumns(column); |
|
2509 } |
|
2510 |
|
2511 /*! |
|
2512 Removes all items in the view. |
|
2513 This will also remove all selections. |
|
2514 The table dimensions stay the same. |
|
2515 */ |
|
2516 |
|
2517 void QTableWidget::clear() |
|
2518 { |
|
2519 Q_D(QTableWidget); |
|
2520 selectionModel()->clear(); |
|
2521 d->tableModel()->clear(); |
|
2522 } |
|
2523 |
|
2524 /*! |
|
2525 \since 4.2 |
|
2526 |
|
2527 Removes all items not in the headers from the view. |
|
2528 This will also remove all selections. |
|
2529 The table dimensions stay the same. |
|
2530 */ |
|
2531 void QTableWidget::clearContents() |
|
2532 { |
|
2533 Q_D(QTableWidget); |
|
2534 selectionModel()->clear(); |
|
2535 d->tableModel()->clearContents(); |
|
2536 } |
|
2537 |
|
2538 /*! |
|
2539 Returns a list of MIME types that can be used to describe a list of |
|
2540 tablewidget items. |
|
2541 |
|
2542 \sa mimeData() |
|
2543 */ |
|
2544 QStringList QTableWidget::mimeTypes() const |
|
2545 { |
|
2546 return d_func()->tableModel()->QAbstractTableModel::mimeTypes(); |
|
2547 } |
|
2548 |
|
2549 /*! |
|
2550 Returns an object that contains a serialized description of the specified |
|
2551 \a items. The format used to describe the items is obtained from the |
|
2552 mimeTypes() function. |
|
2553 |
|
2554 If the list of items is empty, 0 is returned rather than a serialized |
|
2555 empty list. |
|
2556 */ |
|
2557 QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*>) const |
|
2558 { |
|
2559 return d_func()->tableModel()->internalMimeData(); |
|
2560 } |
|
2561 |
|
2562 /*! |
|
2563 Handles the \a data supplied by a drag and drop operation that ended with |
|
2564 the given \a action in the given \a row and \a column. |
|
2565 Returns true if the data and action can be handled by the model; |
|
2566 otherwise returns false. |
|
2567 |
|
2568 \sa supportedDropActions() |
|
2569 */ |
|
2570 bool QTableWidget::dropMimeData(int row, int column, const QMimeData *data, Qt::DropAction action) |
|
2571 { |
|
2572 QModelIndex idx; |
|
2573 #ifndef QT_NO_DRAGANDDROP |
|
2574 if (dropIndicatorPosition() == QAbstractItemView::OnItem) { |
|
2575 // QAbstractTableModel::dropMimeData will overwrite on the index if row == -1 and column == -1 |
|
2576 idx = model()->index(row, column); |
|
2577 row = -1; |
|
2578 column = -1; |
|
2579 } |
|
2580 #endif |
|
2581 return d_func()->tableModel()->QAbstractTableModel::dropMimeData(data, action , row, column, idx); |
|
2582 } |
|
2583 |
|
2584 /*! |
|
2585 Returns the drop actions supported by this view. |
|
2586 |
|
2587 \sa Qt::DropActions |
|
2588 */ |
|
2589 Qt::DropActions QTableWidget::supportedDropActions() const |
|
2590 { |
|
2591 return d_func()->tableModel()->QAbstractTableModel::supportedDropActions() | Qt::MoveAction; |
|
2592 } |
|
2593 |
|
2594 /*! |
|
2595 Returns a list of pointers to the items contained in the \a data object. |
|
2596 If the object was not created by a QTreeWidget in the same process, the list |
|
2597 is empty. |
|
2598 |
|
2599 */ |
|
2600 QList<QTableWidgetItem*> QTableWidget::items(const QMimeData *data) const |
|
2601 { |
|
2602 const QTableWidgetMimeData *twd = qobject_cast<const QTableWidgetMimeData*>(data); |
|
2603 if (twd) |
|
2604 return twd->items; |
|
2605 return QList<QTableWidgetItem*>(); |
|
2606 } |
|
2607 |
|
2608 /*! |
|
2609 Returns the QModelIndex assocated with the given \a item. |
|
2610 */ |
|
2611 |
|
2612 QModelIndex QTableWidget::indexFromItem(QTableWidgetItem *item) const |
|
2613 { |
|
2614 Q_D(const QTableWidget); |
|
2615 return d->tableModel()->index(item); |
|
2616 } |
|
2617 |
|
2618 /*! |
|
2619 Returns a pointer to the QTableWidgetItem assocated with the given \a index. |
|
2620 */ |
|
2621 |
|
2622 QTableWidgetItem *QTableWidget::itemFromIndex(const QModelIndex &index) const |
|
2623 { |
|
2624 Q_D(const QTableWidget); |
|
2625 return d->tableModel()->item(index); |
|
2626 } |
|
2627 |
|
2628 /*! |
|
2629 \internal |
|
2630 */ |
|
2631 void QTableWidget::setModel(QAbstractItemModel * /*model*/) |
|
2632 { |
|
2633 Q_ASSERT(!"QTableWidget::setModel() - Changing the model of the QTableWidget is not allowed."); |
|
2634 } |
|
2635 |
|
2636 /*! \reimp */ |
|
2637 bool QTableWidget::event(QEvent *e) |
|
2638 { |
|
2639 return QTableView::event(e); |
|
2640 } |
|
2641 |
|
2642 #ifndef QT_NO_DRAGANDDROP |
|
2643 /*! \reimp */ |
|
2644 void QTableWidget::dropEvent(QDropEvent *event) { |
|
2645 Q_D(QTableWidget); |
|
2646 if (event->source() == this && (event->dropAction() == Qt::MoveAction || |
|
2647 dragDropMode() == QAbstractItemView::InternalMove)) { |
|
2648 QModelIndex topIndex; |
|
2649 int col = -1; |
|
2650 int row = -1; |
|
2651 if (d->dropOn(event, &row, &col, &topIndex)) { |
|
2652 QModelIndexList indexes = selectedIndexes(); |
|
2653 int top = INT_MAX; |
|
2654 int left = INT_MAX; |
|
2655 for (int i = 0; i < indexes.count(); ++i) { |
|
2656 top = qMin(indexes.at(i).row(), top); |
|
2657 left = qMin(indexes.at(i).column(), left); |
|
2658 } |
|
2659 |
|
2660 QList<QTableWidgetItem *> taken; |
|
2661 for (int i = 0; i < indexes.count(); ++i) |
|
2662 taken.append(takeItem(indexes.at(i).row(), indexes.at(i).column())); |
|
2663 |
|
2664 for (int i = 0; i < indexes.count(); ++i) { |
|
2665 QModelIndex index = indexes.at(i); |
|
2666 int r = index.row() - top + topIndex.row(); |
|
2667 int c = index.column() - left + topIndex.column(); |
|
2668 setItem(r, c, taken.takeFirst()); |
|
2669 } |
|
2670 |
|
2671 event->accept(); |
|
2672 // Don't want QAbstractItemView to delete it because it was "moved" we already did it |
|
2673 event->setDropAction(Qt::CopyAction); |
|
2674 } |
|
2675 } |
|
2676 |
|
2677 QTableView::dropEvent(event); |
|
2678 } |
|
2679 #endif |
|
2680 |
|
2681 QT_END_NAMESPACE |
|
2682 |
|
2683 #include "moc_qtablewidget.cpp" |
|
2684 |
|
2685 #endif // QT_NO_TABLEWIDGET |