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

📄 q3listbox.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    setSelected(i, !i->isSelected());                    shouldBlock = true;                    d->pressedSelected = false;                }                bool blocked = signalsBlocked();                blockSignals(shouldBlock);                setCurrentItem(i);                blockSignals(blocked);            }            break;        case Multi:	    {                setSelected(i, !i->s);                bool b = signalsBlocked();                blockSignals(true);                setCurrentItem(i);                blockSignals(b);                break;	    }        case NoSelection:            setCurrentItem(i);            break;        }    } else {        bool unselect = true;        if (e->button() == Qt::LeftButton) {            if (d->selectionMode == Multi ||                 d->selectionMode == Extended) {                d->tmpCurrent = d->current;                d->current = 0;                updateItem(d->tmpCurrent);                if (d->rubber)                    delete d->rubber;                d->rubber = 0;                d->rubber = new QRect(e->x(), e->y(), 0, 0);                if (d->selectionMode == Extended && !(e->state() & Qt::ControlButton))                    selectAll(false);                unselect = false;            }            if (unselect && (e->button() == Qt::RightButton ||                               (selectionMode() == Multi || selectionMode() == Extended)))                clearSelection();        }    }    // for sanity, in case people are event-filtering or whatnot    delete d->scrollTimer;    d->scrollTimer = 0;    if (i) {        d->mousePressColumn = d->currentColumn;        d->mousePressRow = d->currentRow;    } else {        d->mousePressColumn = -1;        d->mousePressRow = -1;    }    d->ignoreMoves = false;    d->pressedItem = i;    emit pressed(i);    emit pressed(i, e->globalPos());    emit mouseButtonPressed(e->button(), i, e->globalPos());    if (e->button() == Qt::RightButton)        emit rightButtonPressed(i, e->globalPos());}/*! \reimp */void Q3ListBox::mouseReleaseEvent(QMouseEvent *e){    if (d->selectionMode == Extended &&        d->dragging) {        d->dragging = false;        if (d->current != d->pressedItem) {            updateSelection(); // when we drag, we get an update after we release        }    }    if (d->rubber) {        drawRubber();        delete d->rubber;        d->rubber = 0;        d->current = d->tmpCurrent;        updateItem(d->current);    }    if (d->scrollTimer)        mouseMoveEvent(e);    delete d->scrollTimer;    d->scrollTimer = 0;    d->ignoreMoves = false;    if (d->selectionMode == Extended &&         d->current == d->pressedItem &&         d->pressedSelected && d->current) {        bool block = signalsBlocked();        blockSignals(true);        clearSelection();        blockSignals(block);        d->current->s = true;        emit selectionChanged();    }    Q3ListBoxItem * i = itemAt(e->pos());    bool emitClicked = d->mousePressColumn != -1 && d->mousePressRow != -1 || !d->pressedItem;    emitClicked = emitClicked && d->pressedItem == i;    d->pressedItem = 0;    d->mousePressRow = -1;    d->mousePressColumn = -1;    d->mouseInternalPress = false;    if (emitClicked) {        emit clicked(i);        emit clicked(i, e->globalPos());        emit mouseButtonClicked(e->button(), i, e->globalPos());        if (e->button() == Qt::RightButton)            emit rightButtonClicked(i, e->globalPos());    }}/*! \reimp */void Q3ListBox::mouseDoubleClickEvent(QMouseEvent *e){    bool ok = true;    Q3ListBoxItem *i = itemAt(e->pos());    if (!i || selectionMode() == NoSelection)        ok = false;    d->ignoreMoves = true;    if (d->current && ok) {        Q3ListBoxItem * i = d->current;        QString tmp = d->current->text();        emit selected(currentItem());        emit selected(i);        if (!tmp.isNull())            emit selected(tmp);        emit doubleClicked(i);    }}/*! \reimp */void Q3ListBox::mouseMoveEvent(QMouseEvent *e){    Q3ListBoxItem * i = itemAt(e->pos());    if (i != d->highlighted) {        if (i) {            emit onItem(i);        } else {            emit onViewport();        }        d->highlighted = i;    }    if (d->rubber) {        QRect r = d->rubber->normalized();        drawRubber();        d->rubber->setCoords(d->rubber->x(), d->rubber->y(), e->x(), e->y());        doRubberSelection(r, d->rubber->normalized());        drawRubber();        return;    }    if (((e->state() & (Qt::RightButton | Qt::LeftButton | Qt::MidButton)) == 0) ||         d->ignoreMoves)        return;    // hack to keep the combo (and what else?) working: if we get a    // move outside the listbox without having seen a press, discard    // it.    if (!QRect(0, 0, visibleWidth(), visibleHeight()).contains(e->pos()) &&         (d->mousePressColumn < 0 && d->mousePressRow < 0 ||           (e->state() == Qt::NoButton && !d->pressedItem)))        return;    // figure out in what direction to drag-select and perhaps scroll    int dx = 0;    int x = e->x();    if (x >= visibleWidth()) {        x = visibleWidth()-1;        dx = 1;    } else if (x < 0) {        x = 0;        dx = -1;    }    d->mouseMoveColumn = columnAt(x + contentsX());    // sanitize mousePressColumn, if we got here without a mouse press event    if (d->mousePressColumn < 0 && d->mouseMoveColumn >= 0)        d->mousePressColumn = d->mouseMoveColumn;    if (d->mousePressColumn < 0 && d->currentColumn >= 0)        d->mousePressColumn = d->currentColumn;    // if it's beyond the last column, use the last one    if (d->mouseMoveColumn < 0)        d->mouseMoveColumn = dx >= 0 ? numColumns()-1 : 0;    // repeat for y    int dy = 0;    int y = e->y();    if (y >= visibleHeight()) {        y = visibleHeight()-1;        dy = 1;    } else if (y < 0) {        y = 0;        dy = -1;    }    d->mouseMoveRow = rowAt(y + contentsY());    if (d->mousePressRow < 0 && d->mouseMoveRow >= 0)        d->mousePressRow = d->mouseMoveRow;    if (d->mousePressRow < 0 && d->currentRow >= 0)        d->mousePressRow = d->currentRow;    if (d->mousePressRow < 0)        d->mousePressRow = rowAt(x + contentsX());    d->scrollPos = QPoint(dx, dy);    if ((dx || dy) && !d->scrollTimer && e->state() == Qt::LeftButton && e->button() != Qt::LeftButton) {        // start autoscrolling if necessary        d->scrollTimer = new QTimer(this);        connect(d->scrollTimer, SIGNAL(timeout()),                 this, SLOT(doAutoScroll()));        d->scrollTimer->start(100, false);        doAutoScroll();    } else if (!d->scrollTimer) {        // or just select the required bits        updateSelection();    }}void Q3ListBox::updateSelection(){    if (d->mouseMoveColumn >= 0 && d->mouseMoveRow >= 0 &&         d->mousePressColumn >= 0 && d->mousePressRow >= 0) {        Q3ListBoxItem * i = item(d->mouseMoveColumn * numRows() +                                 d->mouseMoveRow);#ifndef QT_NO_ACCESSIBILITY        int ind = index(i);#endif        if (selectionMode() == Single || selectionMode() == NoSelection) {            if (i && (d->mouseInternalPress || (windowType() == Qt::Popup)))                setCurrentItem(i);        } else {            if (d->selectionMode == Extended && (                 (d->current == d->pressedItem && d->pressedSelected) ||                (d->dirtyDrag && !d->dragging))) {                if (d->dirtyDrag && !d->dragging) // emit after dragging stops                    d->dirtyDrag = false;                else                    clearSelection(); // don't reset drag-selected items                d->pressedItem = 0;                if (i && i->isSelectable()) {                    bool block = signalsBlocked();                    blockSignals(true);                    i->s = true;                    blockSignals(block);                    emit selectionChanged();#ifndef QT_NO_ACCESSIBILITY                    QAccessible::updateAccessibility(viewport(), ind+1, QAccessible::StateChanged);                    QAccessible::updateAccessibility(viewport(), 0, QAccessible::Selection);                    QAccessible::updateAccessibility(viewport(), ind+1, QAccessible::SelectionAdd);#endif                }                triggerUpdate(false);            } else {                int c = qMin(d->mouseMoveColumn, d->mousePressColumn);                int r = qMin(d->mouseMoveRow, d->mousePressRow);                int c2 = qMax(d->mouseMoveColumn, d->mousePressColumn);                int r2 = qMax(d->mouseMoveRow, d->mousePressRow);                bool changed = false;                while(c <= c2) {                    Q3ListBoxItem * i = item(c*numRows()+r);                    int rtmp = r;                    while(i && rtmp <= r2) {                        if ((bool)i->s != (bool)d->select && i->isSelectable()) {                            i->s = d->select;#ifndef QT_NO_ACCESSIBILITY                            QAccessible::updateAccessibility(viewport(), ind+1, QAccessible::StateChanged);                            QAccessible::updateAccessibility(viewport(), ind+1, d->select ? QAccessible::SelectionAdd : QAccessible::SelectionRemove);#endif                            i->dirty = true;                            d->dirtyDrag = changed = true;                        }                        i = i->n;                        rtmp++;                    }                    c++;                }                if (changed) {                    if (!d->dragging) // emit after dragging stops instead                        emit selectionChanged();#ifndef QT_NO_ACCESSIBILITY                    QAccessible::updateAccessibility(viewport(), 0, QAccessible::Selection);#endif                    triggerUpdate(false);                }            }            if (i)                setCurrentItem(i);        }    }}void Q3ListBox::repaintSelection(){    if (d->numColumns == 1) {        for (uint i = topItem(); itemVisible(i) && i < count(); ++i) {            Q3ListBoxItem *it = item(i);            if (!it)                break;            if (it->isSelected())                updateItem(it);        }    } else {        for (uint i = 0; i < count(); ++i) {            Q3ListBoxItem *it = item(i);            if (!it)                break;            if (it->isSelected())                updateItem(it);        }    }}/*! \reimp*/void Q3ListBox::contentsContextMenuEvent(QContextMenuEvent *e){    if (!receivers(SIGNAL(contextMenuRequested(Q3ListBoxItem*,QPoint)))) {        e->ignore();        return;    }    if (e->reason() == QContextMenuEvent::Keyboard) {        Q3ListBoxItem *i = item(currentItem());        if (i) {            QRect r = itemRect(i);            emit contextMenuRequested(i, mapToGlobal(r.topLeft() + QPoint(width() / 2, r.height() / 2)));        }    } else {        Q3ListBoxItem * i = itemAt(contentsToViewport(e->pos()));        emit contextMenuRequested(i, e->globalPos());    }}/*!\reimp*/void Q3ListBox::keyPressEvent(QKeyEvent *e){    if ((e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab)         && e->state() & Qt::ControlButton)        e->ignore();    if (count() == 0) {        e->ignore();        return;    }    QPointer<Q3ListBox> selfCheck = this;    Q3ListBoxItem *old = d->current;    if (!old) {        setCurrentItem(d->head);        if (d->selectionMode == Single)            setSelected(d->head, true);        e->ignore();        return;    }    bool selectCurrent = false;    switch (e->key()) {        case Qt::Key_Up:            {                d->currInputString.clear();                if (currentItem() > 0) {                    setCurrentItem(currentItem() - 1);                    handleItemChange(old, e->state() & Qt::ShiftButton, e->state() & Qt::ControlButton);                }                if (!(e->state() & Qt::ShiftButton) || !d->selectAnchor)                    d->selectAnchor = d->current;            }            break;        case Qt::Key_Down:            {                d->currInputString.clear();                if (currentItem() < (int)count() - 1) {                    setCurrentItem(currentItem() + 1);                    handleItemChange(old, e->state() & Qt::ShiftButton, e->state() & Qt::ControlButton);                }                if (!(e->state() & Qt::ShiftButton) || !d->selectAnchor)                    d->selectAnchor = d->current;            }            break;        case Qt::Key_Left:            {                d->currInputString.clear();                if (currentColumn() > 0) {                    setCurrentItem(currentItem() - numRows());                    handleItemChange(old, e->state() & Qt::ShiftButton, e->state() & Qt::ControlButton);                } else if (numColumns() > 1 && currentItem() > 0) {                    int row = currentRow();                    setCurrentItem(currentRow() - 1 + (numColumns() - 1) * numRows());                    if (currentItem() == -1)                        setCurrentItem(row - 1 + (numColumns() - 2) * numRows());                    handleItemChange(old, e->state() & Qt::ShiftButton, e->state() & Qt::ControlButton);                } else {                    QApplication::sendEvent(horizontalScrollBar(), e);                }                if (!(e->state() & Qt::ShiftButton) || !d->selectAnchor)                    d->selectAnchor = d->current;            }            break;        case Qt::Key_Right:            {                d->currInputString.clear();                if (currentColumn() < numColumns()-1) {                    int row = currentRow();                    int i = currentItem();                    Q3ListBoxItem *it = item(i + numRows());                    if (!it)                        it = item(count()-1);                    setCurrentItem(it);                    if (currentItem() == -1) {                        if (row < numRows() - 1)                            setCurrentItem(row + 1);                        else                            setCurrentItem(i);                    }                    handleItemChange(old, e->state() & Qt::ShiftButton, e->state() & Qt::ControlButton);                } else if (numColumns() > 1 && currentRow() < numRows()) {                    if (currentRow() + 1 < numRows()) {                        setCurrentItem(currentRow() + 1);                        handleItemChange(old, e->state() & Qt::ShiftButton, e->state() & Qt::ControlButton);                    }                } else {                    QApplication::sendEvent(horizontalScrollBar(), e);                }                if (!(e->state() & Qt::ShiftButton) || !d->selectAnchor)                    d->selectAnchor = d->current;            }            break;        case Qt::Key_Next:            {                d->currInputString.clear();                int i = 0;                if (numColumns() == 1) {                    i = currentItem() + numItemsVisible();                    i = i > (int)count() - 1 ? (int)count() - 1 : i;                    setCurrentItem(i);                    setBottomItem(i);                } else {                    // I'm not sure about this behavior...                    if (currentRow() == 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -