⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qlistview.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
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 + -