📄 qtextcontrol.cpp
字号:
setClipboardSelection();#endif } repaintOldAndNewSelection(oldSelection); cursorIsFocusIndicator = false; selectedWordOnDoubleClick = cursor; trippleClickPoint = pos; trippleClickTimer.start(qApp->doubleClickInterval(), q);}void QTextControlPrivate::contextMenuEvent(const QPoint &screenPos, const QPointF &docPos, QWidget *contextWidget){#ifdef QT_NO_CONTEXTMENU Q_UNUSED(screenPos); Q_UNUSED(docPos); Q_UNUSED(contextWidget);#else Q_Q(QTextControl); if (!hasFocus) return; QMenu *menu = q->createStandardContextMenu(docPos, contextWidget); if (!menu) return; menu->exec(screenPos); delete menu;#endif}bool QTextControlPrivate::dragEnterEvent(QEvent *e, const QMimeData *mimeData){ Q_Q(QTextControl); if (!(interactionFlags & Qt::TextEditable) || !q->canInsertFromMimeData(mimeData)) { e->ignore(); return false; } dndFeedbackCursor = QTextCursor(); return true; // accept proposed action}void QTextControlPrivate::dragLeaveEvent(){ Q_Q(QTextControl); const QRectF crect = q->cursorRect(dndFeedbackCursor); dndFeedbackCursor = QTextCursor(); if (crect.isValid()) emit q->updateRequest(crect);}bool QTextControlPrivate::dragMoveEvent(QEvent *e, const QMimeData *mimeData, const QPointF &pos){ Q_Q(QTextControl); if (!(interactionFlags & Qt::TextEditable) || !q->canInsertFromMimeData(mimeData)) { e->ignore(); return false; } const int cursorPos = doc->documentLayout()->hitTest(pos, Qt::FuzzyHit); if (cursorPos != -1) { QRectF crect = q->cursorRect(dndFeedbackCursor); if (crect.isValid()) emit q->updateRequest(crect); dndFeedbackCursor = cursor; dndFeedbackCursor.setPosition(cursorPos); crect = q->cursorRect(dndFeedbackCursor); emit q->updateRequest(crect); } return true; // accept proposed action}bool QTextControlPrivate::dropEvent(const QMimeData *mimeData, const QPointF &pos, Qt::DropAction dropAction, QWidget *source){ Q_Q(QTextControl); dndFeedbackCursor = QTextCursor(); if (!(interactionFlags & Qt::TextEditable) || !q->canInsertFromMimeData(mimeData)) return false; repaintSelection(); QTextCursor insertionCursor = q->cursorForPosition(pos); insertionCursor.beginEditBlock(); if (dropAction == Qt::MoveAction && source == contextWidget) cursor.removeSelectedText(); cursor = insertionCursor; q->insertFromMimeData(mimeData); insertionCursor.endEditBlock(); q->ensureCursorVisible(); return true; // accept proposed action}void QTextControlPrivate::inputMethodEvent(QInputMethodEvent *e){ if (!(interactionFlags & Qt::TextEditable) || cursor.isNull()) { e->ignore(); return; } cursor.beginEditBlock(); cursor.removeSelectedText(); // insert commit string if (!e->commitString().isEmpty() || e->replacementLength()) { QTextCursor c = cursor; c.setPosition(c.position() + e->replacementStart()); c.setPosition(c.position() + e->replacementLength(), QTextCursor::KeepAnchor); c.insertText(e->commitString()); } QTextBlock block = cursor.block(); QTextLayout *layout = block.layout(); layout->setPreeditArea(cursor.position() - block.position(), e->preeditString()); QList<QTextLayout::FormatRange> overrides; preeditCursor = e->preeditString().length(); hideCursor = false; for (int i = 0; i < e->attributes().size(); ++i) { const QInputMethodEvent::Attribute &a = e->attributes().at(i); if (a.type == QInputMethodEvent::Cursor) { preeditCursor = a.start; hideCursor = !a.length; } else if (a.type == QInputMethodEvent::TextFormat) { QTextCharFormat f = qvariant_cast<QTextFormat>(a.value).toCharFormat(); if (f.isValid()) { QTextLayout::FormatRange o; o.start = a.start + cursor.position() - block.position(); o.length = a.length; o.format = f; overrides.append(o); } } } layout->setAdditionalFormats(overrides); cursor.endEditBlock();}QVariant QTextControl::inputMethodQuery(Qt::InputMethodQuery property) const{ Q_D(const QTextControl); QTextBlock block = d->cursor.block(); switch(property) { case Qt::ImMicroFocus: return cursorRect(); case Qt::ImFont: return QVariant(d->cursor.charFormat().font()); case Qt::ImCursorPosition: return QVariant(d->cursor.position() - block.position()); case Qt::ImSurroundingText: return QVariant(block.text()); case Qt::ImCurrentSelection: return QVariant(d->cursor.selectedText()); default: return QVariant(); }}void QTextControl::setFocus(bool focus, Qt::FocusReason reason){ QFocusEvent ev(focus ? QEvent::FocusIn : QEvent::FocusOut, reason); processEvent(&ev);}void QTextControlPrivate::focusEvent(QFocusEvent *e){ Q_Q(QTextControl); emit q->updateRequest(q->selectionRect()); if (e->gotFocus()) {#ifdef QT_KEYPAD_NAVIGATION if (!QApplication::keypadNavigationEnabled() || (hasEditFocus && e->reason() == Qt::PopupFocusReason)) {#endif cursorOn = (interactionFlags & Qt::TextSelectableByKeyboard); if (interactionFlags & Qt::TextEditable) { setBlinkingCursorEnabled(true); }#ifdef QT_KEYPAD_NAVIGATION }#endif } else { setBlinkingCursorEnabled(false); if (interactionFlags & Qt::LinksAccessibleByKeyboard && e->reason() != Qt::ActiveWindowFocusReason && e->reason() != Qt::PopupFocusReason && cursor.hasSelection()) { cursor.clearSelection(); } } hasFocus = e->gotFocus();}QString QTextControlPrivate::anchorForCursor(const QTextCursor &anchorCursor) const{ if (anchorCursor.hasSelection()) { QTextCursor cursor = anchorCursor; if (cursor.selectionStart() != cursor.position()) cursor.setPosition(cursor.selectionStart()); cursor.movePosition(QTextCursor::NextCharacter); QTextCharFormat fmt = cursor.charFormat(); if (fmt.isAnchor() && fmt.hasProperty(QTextFormat::AnchorHref)) return fmt.stringProperty(QTextFormat::AnchorHref); } return QString();}#ifdef QT_KEYPAD_NAVIGATIONvoid QTextControlPrivate::editFocusEvent(QEvent *e){ Q_Q(QTextControl); if (QApplication::keypadNavigationEnabled()) { if (e->type() == QEvent::EnterEditFocus && interactionFlags & Qt::TextEditable) { const QTextCursor oldSelection = cursor; const int oldCursorPos = cursor.position(); const bool moved = cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor); q->ensureCursorVisible(); if (moved) { if (cursor.position() != oldCursorPos) emit q->cursorPositionChanged(); emit q->microFocusChanged(); } selectionChanged(); repaintOldAndNewSelection(oldSelection); setBlinkingCursorEnabled(true); } else setBlinkingCursorEnabled(false); } hasEditFocus = e->type() == QEvent::EnterEditFocus ? true : false;}#endif#ifndef QT_NO_CONTEXTMENUQMenu *QTextControl::createStandardContextMenu(const QPointF &pos, QWidget *parent){ Q_D(QTextControl); const bool showTextSelectionActions = d->interactionFlags & (Qt::TextEditable | Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse); d->linkToCopy = QString(); if (!pos.isNull()) d->linkToCopy = anchorAt(pos); if (d->linkToCopy.isEmpty() && !showTextSelectionActions) return 0; QMenu *menu = new QMenu(parent); QAction *a; if (d->interactionFlags & Qt::TextEditable) { QString text = tr("&Undo"); a = menu->addAction(tr("&Undo") + ACCEL_KEY(QKeySequence::Undo), this, SLOT(undo())); a->setEnabled(d->doc->isUndoAvailable()); a = menu->addAction(tr("&Redo") + ACCEL_KEY(QKeySequence::Redo), this, SLOT(redo())); a->setEnabled(d->doc->isRedoAvailable()); menu->addSeparator(); a = menu->addAction(tr("Cu&t") + ACCEL_KEY(QKeySequence::Cut), this, SLOT(cut())); a->setEnabled(d->cursor.hasSelection()); } if (showTextSelectionActions) { a = menu->addAction(tr("&Copy") + ACCEL_KEY(QKeySequence::Copy), this, SLOT(copy())); a->setEnabled(d->cursor.hasSelection()); } if ((d->interactionFlags & Qt::LinksAccessibleByKeyboard) || (d->interactionFlags & Qt::LinksAccessibleByMouse)) { a = menu->addAction(tr("Copy &Link Location"), this, SLOT(_q_copyLink())); a->setEnabled(!d->linkToCopy.isEmpty()); } if (d->interactionFlags & Qt::TextEditable) {#if !defined(QT_NO_CLIPBOARD) a = menu->addAction(tr("&Paste") + ACCEL_KEY(QKeySequence::Paste), this, SLOT(paste())); a->setEnabled(canPaste());#endif a = menu->addAction(tr("Delete"), this, SLOT(_q_deleteSelected())); a->setEnabled(d->cursor.hasSelection()); } if (showTextSelectionActions) { menu->addSeparator(); a = menu->addAction(tr("Select All") + ACCEL_KEY(QKeySequence::SelectAll), this, SLOT(selectAll())); a->setEnabled(!d->doc->isEmpty()); } if (d->interactionFlags & Qt::TextEditable) { menu->addSeparator(); QUnicodeControlCharacterMenu *ctrlCharacterMenu = new QUnicodeControlCharacterMenu(this, menu); menu->addMenu(ctrlCharacterMenu); } return menu;}#endif // QT_NO_CONTEXTMENUQTextCursor QTextControl::cursorForPosition(const QPointF &pos) const{ Q_D(const QTextControl); int cursorPos = d->doc->documentLayout()->hitTest(pos, Qt::FuzzyHit); if (cursorPos == -1) cursorPos = 0; QTextCursor c(d->doc); c.setPosition(cursorPos); return c;}QRectF QTextControl::cursorRect(const QTextCursor &cursor) const{ Q_D(const QTextControl); if (cursor.isNull()) return QRectF(); return d->rectForPosition(cursor.position());}QRectF QTextControl::cursorRect() const{ Q_D(const QTextControl); return cursorRect(d->cursor);}QString QTextControl::anchorAt(const QPointF &pos) const{ Q_D(const QTextControl); return d->doc->documentLayout()->anchorAt(pos);}QString QTextControl::anchorAtCursor() const{ Q_D(const QTextControl); return d->anchorForCursor(d->cursor);}bool QTextControl::overwriteMode() const{ Q_D(const QTextControl); return d->overwriteMode;}void QTextControl::setOverwriteMode(bool overwrite){ Q_D(QTextControl); d->overwriteMode = overwrite;}int QTextControl::cursorWidth() const{#ifndef QT_NO_PROPERTIES Q_D(const QTextControl); return d->doc->documentLayout()->property("cursorWidth").toInt();#else return 1;#endif}void QTextControl::setCursorWidth(int width){ Q_D(QTextControl);#ifdef QT_NO_PROPERTIES Q_UNUSED(width);#else d->doc->documentLayout()->setProperty("cursorWidth", width);#endif d->repaintCursor();}bool QTextControl::acceptRichText() const{ Q_D(const QTextControl); return d->acceptRichText;}void QTextControl::setAcceptRichText(bool accept){ Q_D(QTextControl); d->acceptRichText = accept;}#ifndef QT_NO_TEXTEDITvoid QTextControl::setExtraSelections(const QList<QTextEdit::ExtraSelection> &selections){ Q_D(QTextControl); if (selections.count() == d->extraSelections.count()) { bool needUpdate = false; for (int i = 0; i < selections.count(); ++i) if (selections.at(i).cursor.position() != d->extraSelections.at(i).cursor.position() || selections.at(i).cursor.anchor() != d->extraSelections.at(i).cursor.anchor()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -