📄 qlistview.cpp
字号:
void QListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end){ Q_D(QListView); // if the parent is above d->root in the tree, nothing will happen QAbstractItemView::rowsAboutToBeRemoved(parent, start, end); if (parent == d->root) { int count = (end - start + 1); for (int i = d->hiddenRows.count() - 1; i >= 0; --i) { if (d->hiddenRows.at(i) >= start) { if (d->hiddenRows.at(i) <= end) { d->hiddenRows.remove(i); } else { d->hiddenRows[i] -= count; } } } } d->clear(); d->doDelayedItemsLayout();}/*! \reimp*/void QListView::mouseMoveEvent(QMouseEvent *e){ Q_D(QListView); QAbstractItemView::mouseMoveEvent(e); if (state() == DragSelectingState && d->showElasticBand && d->selectionMode != SingleSelection && d->selectionMode != NoSelection) { QRect rect(d->pressedPosition, e->pos() + QPoint(horizontalOffset(), verticalOffset())); rect = rect.normalized(); d->setDirtyRegion(d->mapToViewport(rect.united(d->elasticBand), d->viewMode == QListView::ListMode)); d->elasticBand = rect; }}/*! \reimp*/void QListView::mouseReleaseEvent(QMouseEvent *e){ Q_D(QListView); QAbstractItemView::mouseReleaseEvent(e); // #### move this implementation into a dynamic class if (d->showElasticBand && d->elasticBand.isValid()) { d->setDirtyRegion(d->mapToViewport(d->elasticBand, d->viewMode == QListView::ListMode)); d->elasticBand = QRect(); }}/*! \reimp*/void QListView::timerEvent(QTimerEvent *e){ Q_D(QListView); if (e->timerId() == d->delayedLayout.timerId()) { setState(ExpandingState); // showing the scroll bars will trigger a resize event, doItemsLayout(); // so we set the state to expanding to avoid setState(NoState); // triggering another layout } else if (e->timerId() == d->batchLayoutTimer.timerId()) { if (d->doItemsLayout(d->batchSize)) { // layout is done d->batchLayoutTimer.stop(); updateGeometries(); d->viewport->update(); } } QAbstractItemView::timerEvent(e);}/*! \reimp*/void QListView::resizeEvent(QResizeEvent *e){ Q_D(QListView); QAbstractItemView::resizeEvent(e); if (state() == NoState) { // if we are in adjust mode, post a delayed layout if (d->resizeMode == Adjust) { QSize delta = e->size() - e->oldSize(); if (!d->delayedLayout.isActive() && ((d->flow == LeftToRight && delta.width() != 0) || (d->flow == TopToBottom && delta.height() != 0))) { d->delayedLayout.start(100, this); // wait 1/10 sec before starting the layout } } }}#ifndef QT_NO_DRAGANDDROP/*! \reimp*/void QListView::dragMoveEvent(QDragMoveEvent *e){ // ### move implementation to dynamic Q_D(QListView); if (e->source() == this && d->viewMode == IconMode) { // the ignore by default e->ignore(); if (d->canDecode(e)) { // get old dragged items rect QRect itemsRect = d->dynamicListView->itemsRect(d->dynamicListView->draggedItems); d->setDirtyRegion(itemsRect.translated(d->dynamicListView->draggedItemsDelta())); // update position d->dynamicListView->draggedItemsPos = e->pos(); // get new items rect d->setDirtyRegion(itemsRect.translated(d->dynamicListView->draggedItemsDelta())); // set the item under the cursor to current QModelIndex index; if (d->movement == Snap) { QRect rect(d->dynamicListView->snapToGrid(e->pos() + d->offset()), d->gridSize()); d->intersectingSet(rect); index = d->intersectVector.count() > 0 ? d->intersectVector.last() : QModelIndex(); } else { index = indexAt(e->pos()); } // check if we allow drops here if (e->source() == this && d->dynamicListView->draggedItems.contains(index)) e->accept(); // allow changing item position else if (d->model->flags(index) & Qt::ItemIsDropEnabled) e->accept(); // allow dropping on dropenabled items else if (!index.isValid()) e->accept(); // allow dropping in empty areas } // do autoscrolling if (d->shouldAutoScroll(e->pos())) startAutoScroll(); } else { // not internal QAbstractItemView::dragMoveEvent(e); }}/*! \reimp*/void QListView::dragLeaveEvent(QDragLeaveEvent *e){ // ### move implementation to dynamic Q_D(QListView); if (d->viewMode == IconMode) { d->viewport->update(d->dynamicListView->draggedItemsRect()); // erase the area d->dynamicListView->draggedItemsPos = QPoint(-1, -1); // don't draw the dragged items } QAbstractItemView::dragLeaveEvent(e);}/*! \reimp*/void QListView::dropEvent(QDropEvent *event){ Q_D(QListView); if (event->source() == this && d->viewMode == IconMode) internalDrop(event); // ### move to dynamic else QAbstractItemView::dropEvent(event);}/*! \reimp*/void QListView::startDrag(Qt::DropActions supportedActions){ Q_D(QListView); if (d->viewMode == IconMode) // ### move to dynamic internalDrag(supportedActions); else QAbstractItemView::startDrag(supportedActions);}/*! \internal Called whenever items from the view is dropped on the viewport. The \a event provides additional information.*/void QListView::internalDrop(QDropEvent *event){ Q_D(QListView); if (d->viewMode == QListView::ListMode) return; // ### move to dynamic class QPoint offset(horizontalOffset(), verticalOffset()); QPoint end = event->pos() + offset; QPoint start = d->pressedPosition; QPoint delta = (d->movement == Snap ? d->dynamicListView->snapToGrid(end) - d->dynamicListView->snapToGrid(start) : end - start); QList<QModelIndex> indexes = d->selectionModel->selectedIndexes(); for (int i = 0; i < indexes.count(); ++i) { QModelIndex index = indexes.at(i); QRect rect = rectForIndex(index); d->setDirtyRegion(d->mapToViewport(rect, d->viewMode == QListView::ListMode)); QPoint dest = rect.topLeft() + delta; if (isRightToLeft()) dest.setX(d->flipX(dest.x()) - rect.width()); d->dynamicListView->moveItem(index.row(), dest); d->setDirtyRegion(visualRect(index)); } stopAutoScroll(); d->dynamicListView->draggedItems.clear(); emit indexesMoved(indexes); event->accept(); // we have handled the event}/*! \internal Called whenever the user starts dragging items and the items are movable, enabling internal dragging and dropping of items.*/void QListView::internalDrag(Qt::DropActions supportedActions){ Q_D(QListView); if (d->viewMode == QListView::ListMode) return; // #### move to dynamic class // This function does the same thing as in QAbstractItemView::startDrag(), // plus adding viewitems to the draggedItems list. // We need these items to draw the drag items QModelIndexList indexes = d->selectionModel->selectedIndexes(); if (indexes.count() > 0 ) { if (d->viewport->acceptDrops()) { QModelIndexList::ConstIterator it = indexes.constBegin(); for (; it != indexes.constEnd(); ++it) if (d->model->flags(*it) & Qt::ItemIsDragEnabled) d->dynamicListView->draggedItems.push_back(*it); } QDrag *drag = new QDrag(this); drag->setMimeData(d->model->mimeData(indexes)); Qt::DropAction action = drag->start(supportedActions); d->dynamicListView->draggedItems.clear(); if (action == Qt::MoveAction) d->clearOrRemove(); }}#endif // QT_NO_DRAGANDDROP/*! \reimp*/QStyleOptionViewItem QListView::viewOptions() const{ Q_D(const QListView); QStyleOptionViewItem option = QAbstractItemView::viewOptions(); if (!d->iconSize.isValid()) { // otherwise it was already set in abstractitemview int pm = (d->viewMode == ListMode ? style()->pixelMetric(QStyle::PM_ListViewIconSize) : style()->pixelMetric(QStyle::PM_IconViewIconSize)); option.decorationSize = QSize(pm, pm); } if (d->viewMode == IconMode) { option.showDecorationSelected = false; option.decorationPosition = QStyleOptionViewItem::Top; option.displayAlignment = Qt::AlignCenter; } else { option.decorationPosition = QStyleOptionViewItem::Left; } return option;}/*! \reimp*/void QListView::paintEvent(QPaintEvent *e){ Q_D(QListView); if (!d->itemDelegate) return; QStyleOptionViewItemV3 option = d->viewOptionsV3(); QPainter painter(d->viewport); QRect area = e->rect(); QVector<QModelIndex> toBeRendered;// QVector<QRect> rects = e->region().rects();// for (int i = 0; i < rects.size(); ++i) {// d->intersectingSet(rects.at(i).translated(horizontalOffset(), verticalOffset()));// toBeRendered += d->intersectVector;// } d->intersectingSet(e->rect().translated(horizontalOffset(), verticalOffset()), false); toBeRendered = d->intersectVector; const QModelIndex current = currentIndex(); const QModelIndex hover = d->hover; const QAbstractItemModel *itemModel = d->model; const QItemSelectionModel *selections = d->selectionModel; const bool focus = (hasFocus() || d->viewport->hasFocus()) && current.isValid(); const bool alternate = d->alternatingColors; const QStyle::State state = option.state; const QAbstractItemView::State viewState = this->state(); const bool enabled = (state & QStyle::State_Enabled) != 0; bool alternateBase = false; int previousRow = -2; // trigger the alternateBase adjustment on first pass QVector<QModelIndex>::const_iterator end = toBeRendered.constEnd(); for (QVector<QModelIndex>::const_iterator it = toBeRendered.constBegin(); it != end; ++it) { Q_ASSERT((*it).isValid()); option.rect = visualRect(*it); option.state = state; if (selections && selections->isSelected(*it)) option.state |= QStyle::State_Selected; if (enabled) { QPalette::ColorGroup cg; if ((itemModel->flags(*it) & Qt::ItemIsEnabled) == 0) { option.state &= ~QStyle::State_Enabled; cg = QPalette::Disabled; } else { cg = QPalette::Normal; } option.palette.setCurrentColorGroup(cg); } if (focus && current == *it) { option.state |= QStyle::State_HasFocus; if (viewState == EditingState) option.state |= QStyle::State_Editing; } if (*it == hover) option.state |= QStyle::State_MouseOver; else option.state &= ~QStyle::State_MouseOver; if (alternate) { int row = (*it).row(); if (row != previousRow + 1) { // adjust alternateBase according to rows in the "gap" if (!d->hiddenRows.isEmpty()) { for (int r = qMax(previousRow + 1, 0); r < row; ++r) { if (!d->hiddenRows.contains(r)) alternateBase = !alternateBase; } } else { alternateBase = (row & 1) != 0; } } if (alternateBase) { option.features |= QStyleOptionViewItemV2::Alternate; } else { option.features &= ~QStyleOptionViewItemV2::Alternate; } if (alternateBase) painter.fillRect(option.rect, option.palette.alternateBase()); alternateBase = !alternateBase; previousRow = row; } if (const QWidget *widget = d->editorForIndex(*it)) { QRegion itemGeometry(option.rect); QRegion widgetGeometry(widget->geometry()); painter.save(); painter.setClipRegion(itemGeometry.subtracted(widgetGeometry)); d->delegateForIndex(*it)->paint(&painter, option, *it); painter.restore(); } else { d->delegateForIndex(*it)->paint(&painter, option, *it); } }#ifndef QT_NO_DRAGANDDROP // #### move this implementation into a dynamic class if (d->viewMode == IconMode) if (!d->dynamicListView->draggedItems.isEmpty() && d->viewport->rect().contains(d->dynamicListView->draggedItemsPos)) { QPoint delta = d->dynamicListView->draggedItemsDelta(); painter.translate(delta.x(), delta.y()); d->dynamicListView->drawItems(&painter, d->dynamicListView->draggedItems);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -