📄 qtableview.cpp
字号:
continue; if (d->hasSpans() && paintedCells.testBit(row * columnCount + col)) continue; int colp = columnViewportPosition(col); colp += offset.x(); int colw = columnWidth(col) - gridSize; const QModelIndex index = d->model->index(row, col, d->root); if (index.isValid()) { option.rect = QRect(colp, rowY, colw, rowh); if (alternate) { if (alternateBase) option.features |= QStyleOptionViewItemV2::Alternate; else option.features &= ~QStyleOptionViewItemV2::Alternate; } d->drawCell(&painter, option, index); } } alternateBase = !alternateBase && alternate; } if (showGrid) { // Find the bottom right (the last rows/coloumns might be hidden) while (verticalHeader->isSectionHidden(verticalHeader->logicalIndex(bottom))) --bottom; QPen old = painter.pen(); painter.setPen(gridPen); // Paint each row for (int visualIndex = top; visualIndex <= bottom; ++visualIndex) { int row = verticalHeader->logicalIndex(visualIndex); if (verticalHeader->isSectionHidden(row)) continue; int rowY = rowViewportPosition(row); rowY += offset.y(); int rowh = rowHeight(row) - gridSize; painter.drawLine(dirtyArea.left(), rowY + rowh, dirtyArea.right(), rowY + rowh); } // Paint each column for (int h = left; h <= right; ++h) { int col = horizontalHeader->logicalIndex(h); if (horizontalHeader->isSectionHidden(col)) continue; int colp = columnViewportPosition(col); colp += offset.x(); if (!rightToLeft) colp += columnWidth(col) - gridSize; painter.drawLine(colp, dirtyArea.top(), colp, dirtyArea.bottom()); } //draw the top & left grid lines if the headers are not visible. if (horizontalHeader->isHidden() && verticalScrollMode() == ScrollPerItem) painter.drawLine(dirtyArea.left(), 0, dirtyArea.right(), 0); if (verticalHeader->isHidden() && horizontalScrollMode() == ScrollPerItem) painter.drawLine(0, dirtyArea.top(), 0, dirtyArea.bottom()); painter.setPen(old); } }#ifndef QT_NO_DRAGANDDROP // Paint the dropIndicator d->paintDropIndicator(&painter);#endif}/*! Returns the index position of the model item corresponding to the table item at position \a pos in contents coordinates.*/QModelIndex QTableView::indexAt(const QPoint &pos) const{ Q_D(const QTableView); d->executePostedLayout(); int r = rowAt(pos.y()); int c = columnAt(pos.x()); if (r >= 0 && c >= 0) { if (d->hasSpans()) { QTableViewPrivate::Span span = d->span(r, c); r = span.top(); c = span.left(); } return d->model->index(r, c, d->root); } return QModelIndex();}/*! Returns the horizontal offset of the items in the table view. Note that the table view uses the horizontal header section positions to determine the positions of columns in the view. \sa verticalOffset()*/int QTableView::horizontalOffset() const{ Q_D(const QTableView); return d->horizontalHeader->offset();}/*! Returns the vertical offset of the items in the table view. Note that the table view uses the vertical header section positions to determine the positions of rows in the view. \sa horizontalOffset()*/int QTableView::verticalOffset() const{ Q_D(const QTableView); return d->verticalHeader->offset();}/*! \fn QModelIndex QTableView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) Moves the cursor in accordance with the given \a cursorAction, using the information provided by the \a modifiers. \sa QAbstractItemView::CursorAction*/QModelIndex QTableView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers){ Q_D(QTableView); Q_UNUSED(modifiers); int bottom = d->model->rowCount(d->root) - 1; // make sure that bottom is the bottommost *visible* row while (bottom >= 0 && isRowHidden(bottom)) --bottom; int right = d->model->columnCount(d->root) - 1; while (right >= 0 && isColumnHidden(right)) --right; if (bottom == -1 || right == -1) return QModelIndex(); // model is empty QModelIndex current = currentIndex(); if (!current.isValid()) { int row = 0; int column = 0; while (column < right && isColumnHidden(column)) ++column; while (isRowHidden(row) && row < bottom) ++row; return d->model->index(row, column, d->root); } int visualRow = d->visualRow(current.row()); Q_ASSERT(visualRow != -1); int visualColumn = d->visualColumn(current.column()); Q_ASSERT(visualColumn != -1); if (isRightToLeft()) { if (cursorAction == MoveLeft) cursorAction = MoveRight; else if (cursorAction == MoveRight) cursorAction = MoveLeft; } switch (cursorAction) { case MoveUp: --visualRow; while (visualRow > 0 && isRowHidden(d->logicalRow(visualRow))) --visualRow; if (d->hasSpans()) { int row = d->logicalRow(visualRow); QTableViewPrivate::Span span = d->span(row, current.column()); visualRow = d->visualRow(span.top()); visualColumn = d->visualColumn(span.left()); } break; case MoveDown: if (d->hasSpans()) { QTableViewPrivate::Span span = d->span(current.row(), current.column()); visualRow = d->visualRow(d->rowSpanEndLogical(span.top(), span.height())); } ++visualRow; while (visualRow < bottom && isRowHidden(d->logicalRow(visualRow))) ++visualRow; if (d->hasSpans()) { int row = d->logicalRow(visualRow); QTableViewPrivate::Span span = d->span(row, current.column()); visualColumn = d->visualColumn(span.left()); } break; case MovePrevious: { int left = 0; while (isColumnHidden(left) && left < right) ++left; if (visualColumn == left) { visualColumn = right; int top = 0; while (top < bottom && isRowHidden(d->logicalRow(top))) ++top; if (visualRow == top) visualRow = bottom; else --visualRow; while (visualRow > 0 && isRowHidden(d->logicalRow(visualRow))) --visualRow; break; } // else MoveLeft } case MoveLeft: --visualColumn; while (visualColumn > 0 && isColumnHidden(d->logicalColumn(visualColumn))) --visualColumn; if (d->hasSpans()) { int column = d->logicalColumn(visualColumn); QTableViewPrivate::Span span = d->span(current.row(), column); visualRow = d->visualRow(span.top()); visualColumn = d->visualColumn(span.left()); } break; case MoveNext: if (visualColumn == right) { visualColumn = 0; while (visualColumn < right && isColumnHidden(d->logicalColumn(visualColumn))) ++visualColumn; if (visualRow == bottom) visualRow = 0; else ++visualRow; while (visualRow < bottom && isRowHidden(d->logicalRow(visualRow))) ++visualRow; break; } // else MoveRight case MoveRight: if (d->hasSpans()) { QTableViewPrivate::Span span = d->span(current.row(), current.column()); visualColumn = d->visualColumn(d->columnSpanEndLogical(span.left(), span.width())); } ++visualColumn; while (visualColumn < right && isColumnHidden(d->logicalColumn(visualColumn))) ++visualColumn; if (d->hasSpans()) { int column = d->logicalColumn(visualColumn); QTableViewPrivate::Span span = d->span(current.row(), column); visualRow = d->visualRow(span.top()); } break; case MoveHome: visualColumn = 0; while (visualColumn < right && isColumnHidden(d->logicalColumn(visualColumn))) ++visualColumn; if (modifiers & Qt::ControlModifier) { visualRow = 0; while (visualRow < bottom && isRowHidden(d->logicalRow(visualRow))) ++visualRow; } break; case MoveEnd: visualColumn = right; if (modifiers & Qt::ControlModifier) visualRow = bottom; break; case MovePageUp: { int top = 0; while (top < bottom && isRowHidden(d->logicalRow(top))) ++top; int newRow = qMax(rowAt(visualRect(current).top() - d->viewport->height()), top); return d->model->index(qBound(0, newRow, bottom), current.column(), d->root); } case MovePageDown: { int newRow = qMin(rowAt(visualRect(current).bottom() + d->viewport->height()), bottom); if (newRow < 0) newRow = bottom; return d->model->index(qBound(0, newRow, bottom), current.column(), d->root); }} int logicalRow = d->logicalRow(visualRow); int logicalColumn = d->logicalColumn(visualColumn); if (!d->model->hasIndex(logicalRow, logicalColumn, d->root)) return QModelIndex(); QModelIndex result = d->model->index(logicalRow, logicalColumn, d->root); if (!isIndexHidden(result)) return d->model->index(logicalRow, logicalColumn, d->root); return QModelIndex();}/*! \fn void QTableView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags flags) Selects the items within the given \a rect and in accordance with the specified selection \a flags.*/void QTableView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command){ Q_D(QTableView); QModelIndex tl = indexAt(QPoint(isRightToLeft() ? qMax(rect.left(), rect.right()) : qMin(rect.left(), rect.right()), qMin(rect.top(), rect.bottom()))); QModelIndex br = indexAt(QPoint(isRightToLeft() ? qMin(rect.left(), rect.right()) : qMax(rect.left(), rect.right()), qMax(rect.top(), rect.bottom()))); if (!d->selectionModel || !tl.isValid() || !br.isValid()) return; bool verticalMoved = verticalHeader()->sectionsMoved(); bool horizontalMoved = horizontalHeader()->sectionsMoved(); QItemSelection selection; if (d->hasSpans()) { bool expanded; int top = qMin(d->visualRow(tl.row()), d->visualRow(br.row())); int left = qMin(d->visualColumn(tl.column()), d->visualColumn(br.column())); int bottom = qMax(d->visualRow(tl.row()), d->visualRow(br.row())); int right = qMax(d->visualColumn(tl.column()), d->visualColumn(br.column())); do { expanded = false; QList<QTableViewPrivate::Span>::const_iterator it; for (it = d->spans.constBegin(); it != d->spans.constEnd(); ++it) { QTableViewPrivate::Span span = *it; int t = d->visualRow(span.top()); int l = d->visualColumn(span.left()); int b = d->visualRow(d->rowSpanEndLogical(span.top(), span.height())); int r = d->visualColumn(d->columnSpanEndLogical(span.left(), span.width())); if ((t > bottom) || (l > right) || (top > b) || (left > r)) continue; // no intersect if (t < top) { top = t; expanded = true; } if (l < left) { left = l; expanded = true; } if (b > bottom) { bottom = b; expanded = true; } if (r > right) { right = r; expanded = true; } if (expanded) break; } } while (expanded); for (int horizontal = left; horizontal <= right; ++horizontal) { int column = d->logicalColumn(horizontal); for (int vertical = top; vertical <= bottom; ++vertical) { int row = d->logicalRow(vertical); QModelIndex index = d->model->index(row, column, d->root); selection.append(QItemSelectionRange(index)); } } } else if (verticalMoved && horizontalMoved) { int top = d->visualRow(tl.row()); int left = d->visualColumn(tl.column()); int bottom = d->visualRow(br.row()); int right = d->visualColumn(br.column()); for (int horizontal = left; horizontal <= right; ++horizontal) { int column = d->logicalColumn(horizontal); for (int vertical = top; vertical <= bottom; ++vertical) { int row = d->logicalRow(vertical); QModelIndex index = d->model->index(row, column, d->root); selection.append(QItemSelectionRange(index)); } } } else if (horizontalMoved) { int left = d->visualColumn(tl.column()); int right = d->visualColumn(br.column()); for (int visual = left; visual <= right; ++visual) { int column = d->logicalColumn(visual); QModelIndex topLeft = d->model->index(tl.row(), column, d->root); QModelIndex bottomRight = d->model->index(br.row(), column, d->root); selection.append(QItemSelectionRange(topLeft, bottomRight)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -