diff options
Diffstat (limited to 'src/widgets/itemviews/qtablewidget.cpp')
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 173 |
1 files changed, 96 insertions, 77 deletions
diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 5ba79309f2..6dd812f6fb 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -3,7 +3,6 @@ #include "qtablewidget.h" -#include <qitemdelegate.h> #include <qpainter.h> #include <private/qtablewidget_p.h> @@ -27,12 +26,12 @@ QTableModel::~QTableModel() bool QTableModel::insertRows(int row, int count, const QModelIndex &) { - if (count < 1 || row < 0 || row > verticalHeaderItems.count()) + if (count < 1 || row < 0 || row > verticalHeaderItems.size()) return false; beginInsertRows(QModelIndex(), row, row + count - 1); - int rc = verticalHeaderItems.count(); - int cc = horizontalHeaderItems.count(); + int rc = verticalHeaderItems.size(); + int cc = horizontalHeaderItems.size(); verticalHeaderItems.insert(row, count, 0); if (rc == 0) tableItems.resize(cc * count); @@ -44,12 +43,12 @@ bool QTableModel::insertRows(int row, int count, const QModelIndex &) bool QTableModel::insertColumns(int column, int count, const QModelIndex &) { - if (count < 1 || column < 0 || column > horizontalHeaderItems.count()) + if (count < 1 || column < 0 || column > horizontalHeaderItems.size()) return false; beginInsertColumns(QModelIndex(), column, column + count - 1); - int rc = verticalHeaderItems.count(); - int cc = horizontalHeaderItems.count(); + int rc = verticalHeaderItems.size(); + int cc = horizontalHeaderItems.size(); horizontalHeaderItems.insert(column, count, 0); if (cc == 0) tableItems.resize(rc * count); @@ -62,7 +61,7 @@ bool QTableModel::insertColumns(int column, int count, const QModelIndex &) bool QTableModel::removeRows(int row, int count, const QModelIndex &) { - if (count < 1 || row < 0 || row + count > verticalHeaderItems.count()) + if (count < 1 || row < 0 || row + count > verticalHeaderItems.size()) return false; beginRemoveRows(QModelIndex(), row, row + count - 1); @@ -89,7 +88,7 @@ bool QTableModel::removeRows(int row, int count, const QModelIndex &) bool QTableModel::removeColumns(int column, int count, const QModelIndex &) { - if (count < 1 || column < 0 || column + count > horizontalHeaderItems.count()) + if (count < 1 || column < 0 || column + count > horizontalHeaderItems.size()) return false; beginRemoveColumns(QModelIndex(), column, column + count - 1); @@ -118,7 +117,7 @@ bool QTableModel::removeColumns(int column, int count, const QModelIndex &) void QTableModel::setItem(int row, int column, QTableWidgetItem *item) { int i = tableIndex(row, column); - if (i < 0 || i >= tableItems.count()) + if (i < 0 || i >= tableItems.size()) return; QTableWidgetItem *oldItem = tableItems.at(i); if (item == oldItem) @@ -141,12 +140,12 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) // sorted insertion Qt::SortOrder order = view->horizontalHeader()->sortIndicatorOrder(); QList<QTableWidgetItem *> colItems = columnItems(column); - if (row < colItems.count()) + if (row < colItems.size()) colItems.remove(row); int sortedRow; if (item == nullptr) { // move to after all non-0 (sortable) items - sortedRow = colItems.count(); + sortedRow = colItems.size(); } else { QList<QTableWidgetItem *>::iterator it; it = sortedInsertionIterator(colItems.begin(), colItems.end(), order, item); @@ -234,7 +233,7 @@ void QTableModel::removeItem(QTableWidgetItem *item) void QTableModel::setHorizontalHeaderItem(int section, QTableWidgetItem *item) { - if (section < 0 || section >= horizontalHeaderItems.count()) + if (section < 0 || section >= horizontalHeaderItems.size()) return; QTableWidgetItem *oldItem = horizontalHeaderItems.at(section); if (item == oldItem) @@ -248,7 +247,7 @@ void QTableModel::setHorizontalHeaderItem(int section, QTableWidgetItem *item) if (item) { item->view = view; - item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem); + item->d->headerItem = true; } horizontalHeaderItems[section] = item; emit headerDataChanged(Qt::Horizontal, section, section); @@ -256,7 +255,7 @@ void QTableModel::setHorizontalHeaderItem(int section, QTableWidgetItem *item) void QTableModel::setVerticalHeaderItem(int section, QTableWidgetItem *item) { - if (section < 0 || section >= verticalHeaderItems.count()) + if (section < 0 || section >= verticalHeaderItems.size()) return; QTableWidgetItem *oldItem = verticalHeaderItems.at(section); if (item == oldItem) @@ -270,7 +269,7 @@ void QTableModel::setVerticalHeaderItem(int section, QTableWidgetItem *item) if (item) { item->view = view; - item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem); + item->d->headerItem = true; } verticalHeaderItems[section] = item; emit headerDataChanged(Qt::Vertical, section, section); @@ -278,12 +277,12 @@ void QTableModel::setVerticalHeaderItem(int section, QTableWidgetItem *item) QTableWidgetItem *QTableModel::takeHorizontalHeaderItem(int section) { - if (section < 0 || section >= horizontalHeaderItems.count()) + if (section < 0 || section >= horizontalHeaderItems.size()) return nullptr; QTableWidgetItem *itm = horizontalHeaderItems.at(section); if (itm) { itm->view = nullptr; - itm->itemFlags &= ~ItemIsHeaderItem; + itm->d->headerItem = false; horizontalHeaderItems[section] = 0; } return itm; @@ -291,12 +290,12 @@ QTableWidgetItem *QTableModel::takeHorizontalHeaderItem(int section) QTableWidgetItem *QTableModel::takeVerticalHeaderItem(int section) { - if (section < 0 || section >= verticalHeaderItems.count()) + if (section < 0 || section >= verticalHeaderItems.size()) return nullptr; QTableWidgetItem *itm = verticalHeaderItems.at(section); if (itm) { itm->view = nullptr; - itm->itemFlags &= ~ItemIsHeaderItem; + itm->d->headerItem = false; verticalHeaderItems[section] = 0; } return itm; @@ -318,7 +317,7 @@ QModelIndex QTableModel::index(const QTableWidgetItem *item) const return QModelIndex(); int i = -1; const int id = item->d->id; - if (id >= 0 && id < tableItems.count() && tableItems.at(id) == item) { + if (id >= 0 && id < tableItems.size() && tableItems.at(id) == item) { i = id; } else { // we need to search for the item i = tableItems.indexOf(const_cast<QTableWidgetItem*>(item)); @@ -332,7 +331,7 @@ QModelIndex QTableModel::index(const QTableWidgetItem *item) const void QTableModel::setRowCount(int rows) { - int rc = verticalHeaderItems.count(); + int rc = verticalHeaderItems.size(); if (rows < 0 || rc == rows) return; if (rc < rows) @@ -343,7 +342,7 @@ void QTableModel::setRowCount(int rows) void QTableModel::setColumnCount(int columns) { - int cc = horizontalHeaderItems.count(); + int cc = horizontalHeaderItems.size(); if (columns < 0 || cc == columns) return; if (cc < columns) @@ -354,12 +353,12 @@ void QTableModel::setColumnCount(int columns) int QTableModel::rowCount(const QModelIndex &parent) const { - return parent.isValid() ? 0 : verticalHeaderItems.count(); + return parent.isValid() ? 0 : verticalHeaderItems.size(); } int QTableModel::columnCount(const QModelIndex &parent) const { - return parent.isValid() ? 0 : horizontalHeaderItems.count(); + return parent.isValid() ? 0 : horizontalHeaderItems.size(); } QVariant QTableModel::data(const QModelIndex &index, int role) const @@ -400,7 +399,7 @@ QMap<int, QVariant> QTableModel::itemData(const QModelIndex &index) const QMap<int, QVariant> roles; QTableWidgetItem *itm = item(index); if (itm) { - for (int i = 0; i < itm->values.count(); ++i) { + for (int i = 0; i < itm->values.size(); ++i) { roles.insert(itm->values.at(i).role, itm->values.at(i).value); } @@ -492,7 +491,7 @@ void QTableModel::sort(int column, Qt::SortOrder order) const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::stable_sort(sortable.begin(), sortable.end(), compare); - QList<QTableWidgetItem *> sorted_table(tableItems.count()); + QList<QTableWidgetItem *> sorted_table(tableItems.size()); QModelIndexList from; QModelIndexList to; const int numRows = rowCount(); @@ -500,9 +499,9 @@ void QTableModel::sort(int column, Qt::SortOrder order) from.reserve(numRows * numColumns); to.reserve(numRows * numColumns); for (int i = 0; i < numRows; ++i) { - int r = (i < sortable.count() + int r = (i < sortable.size() ? sortable.at(i).second - : unsortable.at(i - sortable.count())); + : unsortable.at(i - sortable.size())); for (int c = 0; c < numColumns; ++c) { sorted_table[tableIndex(i, c)] = item(r, c); from.append(createIndex(r, c)); @@ -550,7 +549,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, QList<QTableWidgetItem *>::iterator vit = colItems.begin(); qsizetype distanceFromBegin = 0; bool changed = false; - for (int i = 0; i < sorting.count(); ++i) { + for (int i = 0; i < sorting.size(); ++i) { distanceFromBegin = std::distance(colItems.begin(), vit); int oldRow = sorting.at(i).second; QTableWidgetItem *item = colItems.at(oldRow); @@ -583,7 +582,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, // update persistent indexes updateRowIndexes(newPersistentIndexes, oldRow, newRow); // the index of the remaining rows may have changed - for (int j = i + 1; j < sorting.count(); ++j) { + for (int j = i + 1; j < sorting.size(); ++j) { int otherRow = sorting.at(j).second; if (oldRow < otherRow && newRow >= otherRow) --sorting[j].second; @@ -684,9 +683,9 @@ QVariant QTableModel::headerData(int section, Qt::Orientation orientation, int r return QVariant(); QTableWidgetItem *itm = nullptr; - if (orientation == Qt::Horizontal && section < horizontalHeaderItems.count()) + if (orientation == Qt::Horizontal && section < horizontalHeaderItems.size()) itm = horizontalHeaderItems.at(section); - else if (orientation == Qt::Vertical && section < verticalHeaderItems.count()) + else if (orientation == Qt::Vertical && section < verticalHeaderItems.size()) itm = verticalHeaderItems.at(section); else return QVariant(); // section is out of bounds @@ -721,20 +720,20 @@ bool QTableModel::setHeaderData(int section, Qt::Orientation orientation, bool QTableModel::isValid(const QModelIndex &index) const { return (index.isValid() - && index.row() < verticalHeaderItems.count() - && index.column() < horizontalHeaderItems.count()); + && index.row() < verticalHeaderItems.size() + && index.column() < horizontalHeaderItems.size()); } void QTableModel::clear() { - for (int j = 0; j < verticalHeaderItems.count(); ++j) { + for (int j = 0; j < verticalHeaderItems.size(); ++j) { if (verticalHeaderItems.at(j)) { verticalHeaderItems.at(j)->view = nullptr; delete verticalHeaderItems.at(j); verticalHeaderItems[j] = 0; } } - for (int k = 0; k < horizontalHeaderItems.count(); ++k) { + for (int k = 0; k < horizontalHeaderItems.size(); ++k) { if (horizontalHeaderItems.at(k)) { horizontalHeaderItems.at(k)->view = nullptr; delete horizontalHeaderItems.at(k); @@ -747,7 +746,7 @@ void QTableModel::clear() void QTableModel::clearContents() { beginResetModel(); - for (int i = 0; i < tableItems.count(); ++i) { + for (int i = 0; i < tableItems.size(); ++i) { if (tableItems.at(i)) { tableItems.at(i)->view = nullptr; delete tableItems.at(i); @@ -761,7 +760,7 @@ void QTableModel::itemChanged(QTableWidgetItem *item, const QList<int> &roles) { if (!item) return; - if (item->flags() & ItemIsHeaderItem) { + if (item->d->headerItem) { int row = verticalHeaderItems.indexOf(item); if (row >= 0) { emit headerDataChanged(Qt::Vertical, row, row); @@ -809,7 +808,7 @@ QMimeData *QTableModel::internalMimeData() const QMimeData *QTableModel::mimeData(const QModelIndexList &indexes) const { QList<QTableWidgetItem*> items; - const int indexesCount = indexes.count(); + const int indexesCount = indexes.size(); items.reserve(indexesCount); for (int i = 0; i < indexesCount; ++i) items << item(indexes.at(i)); @@ -1294,6 +1293,11 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) */ /*! + \fn void QTableWidgetItem::setTextAlignment(Qt::AlignmentFlag alignment) + \internal +*/ + +/*! Constructs a table item of the specified \a type that does not belong to any table. @@ -1375,7 +1379,7 @@ void QTableWidgetItem::setData(int role, const QVariant &value) { bool found = false; role = (role == Qt::EditRole ? Qt::DisplayRole : role); - for (int i = 0; i < values.count(); ++i) { + for (int i = 0; i < values.size(); ++i) { if (values.at(i).role == role) { if (values[i].value == value) return; @@ -1587,28 +1591,41 @@ QTableWidgetItem &QTableWidgetItem::operator=(const QTableWidgetItem &other) void QTableWidgetPrivate::setup() { Q_Q(QTableWidget); - // view signals - QObject::connect(q, SIGNAL(pressed(QModelIndex)), q, SLOT(_q_emitItemPressed(QModelIndex))); - QObject::connect(q, SIGNAL(clicked(QModelIndex)), q, SLOT(_q_emitItemClicked(QModelIndex))); - QObject::connect(q, SIGNAL(doubleClicked(QModelIndex)), - q, SLOT(_q_emitItemDoubleClicked(QModelIndex))); - QObject::connect(q, SIGNAL(activated(QModelIndex)), q, SLOT(_q_emitItemActivated(QModelIndex))); - QObject::connect(q, SIGNAL(entered(QModelIndex)), q, SLOT(_q_emitItemEntered(QModelIndex))); - // model signals - QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_emitItemChanged(QModelIndex))); - // selection signals - QObject::connect(q->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_emitCurrentItemChanged(QModelIndex,QModelIndex))); - QObject::connect(q->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - q, SIGNAL(itemSelectionChanged())); - // sorting - QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_dataChanged(QModelIndex,QModelIndex))); - QObject::connect(model, SIGNAL(columnsRemoved(QModelIndex,int,int)), q, SLOT(_q_sort())); -} - -void QTableWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) + connections = { + // view signals + QObjectPrivate::connect(q, &QTableWidget::pressed, + this, &QTableWidgetPrivate::emitItemPressed), + QObjectPrivate::connect(q, &QTableWidget::clicked, + this, &QTableWidgetPrivate::emitItemClicked), + QObjectPrivate::connect(q, &QTableWidget::doubleClicked, + this, &QTableWidgetPrivate::emitItemDoubleClicked), + QObjectPrivate::connect(q, &QTableWidget::activated, + this, &QTableWidgetPrivate::emitItemActivated), + QObjectPrivate::connect(q, &QTableWidget::entered, + this, &QTableWidgetPrivate::emitItemEntered), + // model signals + QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged, + this, &QTableWidgetPrivate::emitItemChanged), + // selection signals + QObjectPrivate::connect(q->selectionModel(), &QItemSelectionModel::currentChanged, + this, &QTableWidgetPrivate::emitCurrentItemChanged), + QObject::connect(q->selectionModel(), &QItemSelectionModel::selectionChanged, + q, &QTableWidget::itemSelectionChanged), + // sorting + QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged, + this, &QTableWidgetPrivate::dataChanged), + QObjectPrivate::connect(model, &QAbstractItemModel::columnsRemoved, + this, &QTableWidgetPrivate::sort) + }; +} + +void QTableWidgetPrivate::clearConnections() +{ + for (const QMetaObject::Connection &connection : connections) + QObject::disconnect(connection); +} + +void QTableWidgetPrivate::emitItemPressed(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1616,7 +1633,7 @@ void QTableWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) emit q->cellPressed(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemClicked(const QModelIndex &index) +void QTableWidgetPrivate::emitItemClicked(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1624,7 +1641,7 @@ void QTableWidgetPrivate::_q_emitItemClicked(const QModelIndex &index) emit q->cellClicked(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemDoubleClicked(const QModelIndex &index) +void QTableWidgetPrivate::emitItemDoubleClicked(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1632,7 +1649,7 @@ void QTableWidgetPrivate::_q_emitItemDoubleClicked(const QModelIndex &index) emit q->cellDoubleClicked(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemActivated(const QModelIndex &index) +void QTableWidgetPrivate::emitItemActivated(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1640,7 +1657,7 @@ void QTableWidgetPrivate::_q_emitItemActivated(const QModelIndex &index) emit q->cellActivated(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemEntered(const QModelIndex &index) +void QTableWidgetPrivate::emitItemEntered(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1648,7 +1665,7 @@ void QTableWidgetPrivate::_q_emitItemEntered(const QModelIndex &index) emit q->cellEntered(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemChanged(const QModelIndex &index) +void QTableWidgetPrivate::emitItemChanged(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1656,7 +1673,7 @@ void QTableWidgetPrivate::_q_emitItemChanged(const QModelIndex &index) emit q->cellChanged(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, +void QTableWidgetPrivate::emitCurrentItemChanged(const QModelIndex ¤t, const QModelIndex &previous) { Q_Q(QTableWidget); @@ -1667,7 +1684,7 @@ void QTableWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, emit q->currentCellChanged(current.row(), current.column(), previous.row(), previous.column()); } -void QTableWidgetPrivate::_q_sort() +void QTableWidgetPrivate::sort() { if (sortingEnabled) { int column = horizontalHeader->sortIndicatorSection(); @@ -1676,8 +1693,8 @@ void QTableWidgetPrivate::_q_sort() } } -void QTableWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, - const QModelIndex &bottomRight) +void QTableWidgetPrivate::dataChanged(const QModelIndex &topLeft, + const QModelIndex &bottomRight) { if (sortingEnabled && topLeft.isValid() && bottomRight.isValid()) { int column = horizontalHeader->sortIndicatorSection(); @@ -1875,6 +1892,8 @@ QTableWidget::QTableWidget(int rows, int columns, QWidget *parent) */ QTableWidget::~QTableWidget() { + Q_D(QTableWidget); + d->clearConnections(); } /*! @@ -2082,7 +2101,7 @@ void QTableWidget::setVerticalHeaderLabels(const QStringList &labels) Q_D(QTableWidget); QTableModel *model = d->tableModel(); QTableWidgetItem *item = nullptr; - for (int i = 0; i < model->rowCount() && i < labels.count(); ++i) { + for (int i = 0; i < model->rowCount() && i < labels.size(); ++i) { item = model->verticalHeaderItem(i); if (!item) { item = model->createItem(); @@ -2100,7 +2119,7 @@ void QTableWidget::setHorizontalHeaderLabels(const QStringList &labels) Q_D(QTableWidget); QTableModel *model = d->tableModel(); QTableWidgetItem *item = nullptr; - for (int i = 0; i < model->columnCount() && i < labels.count(); ++i) { + for (int i = 0; i < model->columnCount() && i < labels.size(); ++i) { item = model->horizontalHeaderItem(i); if (!item) { item = model->createItem(); @@ -2339,7 +2358,7 @@ QList<QTableWidgetSelectionRange> QTableWidget::selectedRanges() const { const QList<QItemSelectionRange> ranges = selectionModel()->selection(); QList<QTableWidgetSelectionRange> result; - const int rangesCount = ranges.count(); + const int rangesCount = ranges.size(); result.reserve(rangesCount); for (int i = 0; i < rangesCount; ++i) result.append({ranges.at(i).top(), @@ -2577,7 +2596,7 @@ QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem *> &items) const // if non empty, it's called from the model's own mimeData if (cachedIndexes.isEmpty()) { - cachedIndexes.reserve(items.count()); + cachedIndexes.reserve(items.size()); for (QTableWidgetItem *item : items) cachedIndexes << indexFromItem(item); @@ -2692,7 +2711,7 @@ void QTableWidget::dropEvent(QDropEvent *event) { } QList<QTableWidgetItem *> taken; - const int indexesCount = indexes.count(); + const int indexesCount = indexes.size(); taken.reserve(indexesCount); for (const auto &index : indexes) taken.append(takeItem(index.row(), index.column())); |