📄 q3listbox.cpp
字号:
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 + -