📄 qtablewidget.cpp
字号:
view->setItem(index.row(), index.column(), itm); return true;}Qt::ItemFlags QTableModel::flags(const QModelIndex &index) const{ if (!index.isValid()) return Qt::ItemIsDropEnabled; if (QTableWidgetItem *itm = item(index)) return itm->flags(); return (Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled |Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled);}void QTableModel::sort(int column, Qt::SortOrder order){ QVector<QPair<QTableWidgetItem*, int> > sortable; QVector<int> unsortable; sortable.reserve(rowCount()); unsortable.reserve(rowCount()); for (int row = 0; row < rowCount(); ++row) { if (QTableWidgetItem *itm = item(row, column)) sortable.append(QPair<QTableWidgetItem*,int>(itm, row)); else unsortable.append(row); } LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); qStableSort(sortable.begin(), sortable.end(), compare); QVector<QTableWidgetItem*> sorted_table(tableItems.count()); QModelIndexList from; QModelIndexList to; for (int i = 0; i < rowCount(); ++i) { int r = (i < sortable.count() ? sortable.at(i).second : unsortable.at(i - sortable.count())); for (int c = 0; c < columnCount(); ++c) { sorted_table[tableIndex(i, c)] = item(r, c); from.append(createIndex(r, c, 0)); to.append(createIndex(i, c, 0)); } } emit layoutAboutToBeChanged(); tableItems = sorted_table; changePersistentIndexList(from, to); // ### slow emit layoutChanged();}bool QTableModel::canConvertToDouble(const QVariant &value){ switch (value.type()) { case QVariant::Bool: case QVariant::Int: case QVariant::UInt: case QVariant::LongLong: case QVariant::ULongLong: case QVariant::Double: case QVariant::Char: return true; default: return false; } return false;}/* \internal Ensures that rows in the interval [start, end] are sorted according to the contents of column \a column and the given sort \a order.*/void QTableModel::ensureSorted(int column, Qt::SortOrder order, int start, int end){ int count = end - start + 1; QVector < QPair<QTableWidgetItem*,int> > sorting; sorting.reserve(count); for (int row = start; row <= end; ++row) { QTableWidgetItem *itm = item(row, column); if (itm == 0) { // no more sortable items (all 0-items are // at the end of the table when it is sorted) break; } sorting.append(QPair<QTableWidgetItem*,int>(itm, row)); } LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); qStableSort(sorting.begin(), sorting.end(), compare); QModelIndexList oldPersistentIndexes = persistentIndexList(); QModelIndexList newPersistentIndexes = oldPersistentIndexes; QVector<QTableWidgetItem*> newTable = tableItems; QVector<QTableWidgetItem*> newVertical = verticalHeaderItems; QVector<QTableWidgetItem*> colItems = columnItems(column); QVector<QTableWidgetItem*>::iterator vit = colItems.begin(); bool changed = false; for (int i = 0; i < sorting.count(); ++i) { int oldRow = sorting.at(i).second; QTableWidgetItem *item = colItems.at(oldRow); colItems.remove(oldRow); vit = sortedInsertionIterator(vit, colItems.end(), order, item); int newRow = qMax((int)(vit - colItems.begin()), 0); vit = colItems.insert(vit, item); if (newRow != oldRow) { changed = true; // move the items @ oldRow to newRow int cc = columnCount(); QVector<QTableWidgetItem*> rowItems(cc); for (int j = 0; j < cc; ++j) rowItems[j] = newTable.at(tableIndex(oldRow, j)); newTable.remove(tableIndex(oldRow, 0), cc); newTable.insert(tableIndex(newRow, 0), cc, 0); for (int j = 0; j < cc; ++j) newTable[tableIndex(newRow, j)] = rowItems.at(j); QTableWidgetItem *header = newVertical.at(oldRow); newVertical.remove(oldRow); newVertical.insert(newRow, header); // 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) { int otherRow = sorting.at(j).second; if (oldRow < otherRow && newRow >= otherRow) --sorting[j].second; else if (oldRow > otherRow && newRow <= otherRow) ++sorting[j].second; } } } if (changed) { emit layoutAboutToBeChanged(); tableItems = newTable; verticalHeaderItems = newVertical; changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); emit layoutChanged(); }}/* \internal Returns the non-0 items in column \a column.*/QVector<QTableWidgetItem*> QTableModel::columnItems(int column) const{ QVector<QTableWidgetItem*> items; int rc = rowCount(); items.reserve(rc); for (int row = 0; row < rc; ++row) { QTableWidgetItem *itm = item(row, column); if (itm == 0) { // no more sortable items (all 0-items are // at the end of the table when it is sorted) break; } items.append(itm); } return items;}/* \internal Adjusts the row of each index in \a indexes if necessary, given that a row of items has been moved from row \a movedFrom to row \a movedTo.*/void QTableModel::updateRowIndexes(QModelIndexList &indexes, int movedFromRow, int movedToRow){ QModelIndexList::iterator it; for (it = indexes.begin(); it != indexes.end(); ++it) { int oldRow = (*it).row(); int newRow = oldRow; if (oldRow == movedFromRow) newRow = movedToRow; else if (movedFromRow < oldRow && movedToRow >= oldRow) newRow = oldRow - 1; else if (movedFromRow > oldRow && movedToRow <= oldRow) newRow = oldRow + 1; if (newRow != oldRow) *it = index(newRow, (*it).column(), (*it).parent()); }}/* \internal Returns an iterator to the item where \a item should be inserted in the interval (\a begin, \a end) according to the given sort \a order.*/QVector<QTableWidgetItem*>::iterator QTableModel::sortedInsertionIterator( const QVector<QTableWidgetItem*>::iterator &begin, const QVector<QTableWidgetItem*>::iterator &end, Qt::SortOrder order, QTableWidgetItem *item){ if (order == Qt::AscendingOrder) return qLowerBound(begin, end, item, QTableModelLessThan()); return qLowerBound(begin, end, item, QTableModelGreaterThan());}bool QTableModel::itemLessThan(const QPair<QTableWidgetItem*,int> &left, const QPair<QTableWidgetItem*,int> &right){ return *(left.first) < *(right.first);}bool QTableModel::itemGreaterThan(const QPair<QTableWidgetItem*,int> &left, const QPair<QTableWidgetItem*,int> &right){ return (*(right.first) < *(left .first));}QVariant QTableModel::headerData(int section, Qt::Orientation orientation, int role) const{ if (section < 0) return QVariant(); QTableWidgetItem *itm = 0; if (orientation == Qt::Horizontal && section < horizontalHeaderItems.count()) itm = horizontalHeaderItems.at(section); else if (orientation == Qt::Vertical && section < verticalHeaderItems.count()) itm = verticalHeaderItems.at(section); else return QVariant(); // section is out of bounds if (itm) return itm->data(role); if (role == Qt::DisplayRole) return section + 1; return QVariant();}bool QTableModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role){ if (section < 0 || (orientation == Qt::Horizontal && horizontalHeaderItems.size() <= section) || (orientation == Qt::Vertical && verticalHeaderItems.size() <= section)) return false; QTableWidgetItem *itm = 0; if (orientation == Qt::Horizontal) itm = horizontalHeaderItems.at(section); else itm = verticalHeaderItems.at(section); if (itm) { itm->setData(role, value); return true; } return false;}bool QTableModel::isValid(const QModelIndex &index) const{ return (index.isValid() && index.row() < verticalHeaderItems.count() && index.column() < horizontalHeaderItems.count());}void QTableModel::clear(){ for (int j = 0; j < verticalHeaderItems.count(); ++j) { if (verticalHeaderItems.at(j)) { verticalHeaderItems.at(j)->view = 0; delete verticalHeaderItems.at(j); verticalHeaderItems[j] = 0; } } for (int k = 0; k < horizontalHeaderItems.count(); ++k) { if (horizontalHeaderItems.at(k)) { horizontalHeaderItems.at(k)->view = 0; delete horizontalHeaderItems.at(k); horizontalHeaderItems[k] = 0; } } clearContents();}void QTableModel::clearContents(){ for (int i = 0; i < tableItems.count(); ++i) { if (tableItems.at(i)) { tableItems.at(i)->view = 0; delete tableItems.at(i); tableItems[i] = 0; } } reset();}void QTableModel::itemChanged(QTableWidgetItem *item){ if (!item) return; if (item->flags() & ItemIsHeaderItem) { int row = verticalHeaderItems.indexOf(item); if (row >= 0) { emit headerDataChanged(Qt::Vertical, row, row); } else { int column = horizontalHeaderItems.indexOf(item); if (column >= 0) emit headerDataChanged(Qt::Horizontal, column, column); } } else { QModelIndex idx = index(item); if (idx.isValid()) emit dataChanged(idx, idx); }}QTableWidgetItem* QTableModel::createItem() const{ return prototype ? prototype->clone() : new QTableWidgetItem;}const QTableWidgetItem *QTableModel::itemPrototype() const{ return prototype;}void QTableModel::setItemPrototype(const QTableWidgetItem *item){ if (prototype != item) { delete prototype; prototype = item; }}QStringList QTableModel::mimeTypes() const{ const QTableWidget *view = ::qobject_cast<const QTableWidget*>(QObject::parent()); return (view ? view->mimeTypes() : QStringList());}QMimeData *QTableModel::internalMimeData() const{ return QAbstractTableModel::mimeData(cachedIndexes);}QMimeData *QTableModel::mimeData(const QModelIndexList &indexes) const{ QList<QTableWidgetItem*> items; for (int i = 0; i < indexes.count(); ++i) items << item(indexes.at(i)); const QTableWidget *view = ::qobject_cast<const QTableWidget*>(QObject::parent()); // cachedIndexes is a little hack to avoid copying from QModelIndexList to // QList<QTreeWidgetItem*> and back again in the view cachedIndexes = indexes; QMimeData *mimeData = (view ? view->mimeData(items) : 0); cachedIndexes.clear(); return mimeData;}bool QTableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row , int column, const QModelIndex &index){ if (index.isValid()) { row = index.row(); column = index.column(); }else if (row == -1 || column == -1) { // The user dropped outside the table. row = rowCount(); column = 0; } QTableWidget *view = ::qobject_cast<QTableWidget*>(QObject::parent()); return (view ? view->dropMimeData(row, column, data, action) : false);}Qt::DropActions QTableModel::supportedDropActions() const{ const QTableWidget *view = ::qobject_cast<const QTableWidget*>(QObject::parent()); return (view ? view->supportedDropActions() : Qt::DropActions(Qt::IgnoreAction));}/*! \class QTableWidgetSelectionRange \brief The QTableWidgetSelectionRange class provides a container for storing a selection range in a QTableWidget. \ingroup model-view The QTableWidgetSelectionRange class stores the top left and bottom right rows and columns of a selection range in a table. The selections in the table may consist of several selection ranges. \sa QTableWidget*//*! Constructs an table selection range, i.e. a range whose rowCount() and columnCount() are 0.*/QTableWidgetSelectionRange::QTableWidgetSelectionRange() : top(-1), left(-1), bottom(-2), right(-2){}/*! Constructs the table selection range from the given \a top, \a left, \a bottom and \a right table rows and columns. \sa topRow(), leftColumn(), bottomRow(), rightColumn()*/QTableWidgetSelectionRange::QTableWidgetSelectionRange(int top, int left, int bottom, int right) : top(top), left(left), bottom(bottom), right(right){}/*! Constructs a the table selection range by copying the given \a other table selection range.*/QTableWidgetSelectionRange::QTableWidgetSelectionRange(const QTableWidgetSelectionRange &other) : top(other.top), left(other.left), bottom(other.bottom), right(other.right){}/*! Destroys the table selection range.*/QTableWidgetSelectionRange::~QTableWidgetSelectionRange(){}/*! \fn int QTableWidgetSelectionRange::topRow() const Returns the top row of the range. \sa bottomRow(), leftColumn(), rowCount()*//*! \fn int QTableWidgetSelectionRange::bottomRow() const Returns the bottom row of the range. \sa topRow(), rightColumn(), rowCount()*//*! \fn int QTableWidgetSelectionRange::leftColumn() const Returns the left column of the range. \sa rightColumn(), topRow(), columnCount()*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -