编辑文本 - 如何更改光标位置?

Posted

技术标签:

【中文标题】编辑文本 - 如何更改光标位置?【英文标题】:Editing text - how can I change cursor position? 【发布时间】:2015-07-06 21:34:05 【问题描述】:

我有一个TextItem 继承QGraphicsTextItem。我正在尝试根据特定要求使其工作(转换中心是边界矩形的中心)。

由于使用QGraphicsTextItem::paint() 给我带来了一些麻烦(参见question),而且我可能需要特殊的换行,所以最好在paint 中绘制文本。

 #include <QApplication>
#include <QPainter>
#include <QGraphicsItem>
#include <QGraphicsView>

class TextItem: public QGraphicsTextItem

public:
    TextItem()
    
        QFont f;
        f.setPointSize(50);
        f.setBold(true);
        f.setFamily("Helvetica");
        setFont(f);
        sethtml("Caf&#x00e9; Frap&#x00e9;");
        setFlags(QGraphicsItem::ItemIsMovable    |
                 QGraphicsItem::ItemIsFocusable  |
                 QGraphicsItem::ItemIsSelectable);
        setTextInteractionFlags(Qt::NoTextInteraction);
    

    void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
    
        qreal w = QGraphicsTextItem::boundingRect().width();
        qreal h = QGraphicsTextItem::boundingRect().height();
        QRectF r = QRectF(-w/2, -h/2, w, h);
        painter->setPen(QPen(m_penColor));
        painter->setFont(this->font());
        painter->setBrush(Qt::NoBrush);

        painter->drawText(r, this->toPlainText(), this->document()->defaultTextOption());
    

    QRectF boundingRect() const
    
        qreal w = QGraphicsTextItem::boundingRect().width();
        qreal h = QGraphicsTextItem::boundingRect().height();
        QRectF r = QRectF(-w/2, -h/2, w, h);
        return r;
    

protected:
    virtual void focusOutEvent (QFocusEvent * event)
    
        Q_UNUSED(event);
        setTextInteractionFlags(Qt::NoTextInteraction);
    
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
    
        Q_UNUSED(event);
        setTextInteractionFlags(Qt::TextEditorInteraction); 
        setFocus();
    
;

int main(int argc, char *argv[])

    QApplication  a(argc, argv);
    TextItem* t = new TextItem();
    QGraphicsView view(new QGraphicsScene(-200, -150, 400, 300) );
    view.scene()->addItem(t);
    view.show();
    return a.exec();

这适用于使用所需选项绘制文本,但我无法正确编辑 - 文本光标始终位于文本块的开头。

如何移动文本光标?可以贴在油漆上吗?

【问题讨论】:

我放弃了,现在回到 QGraphicTextItem::paint()... . 【参考方案1】:

您首先需要像这样为项目启用编辑功能:

setTextInteractionFlags(Qt::TextEditable);

然后您可以使用 QGraphicsTextItem 中的textCursor() 函数获取文本光标并将其设置为您想要的任何位置,例如:

auto cursor = textCursor();
cursor.movePosition(QTextCursor::End);
setTextCursor(cursor);

更新:

要根据双击的位置进行编辑,可以像这样重新实现QGraphicsTextItem的mouseDoubleClickEvent:

void TextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)

    if (textInteractionFlags() == Qt::NoTextInteraction)
    
        setTextInteractionFlags(Qt::TextEditable);
        setFocus();
    

// ensure that when enabling the edit mode, the cursor is in an appropriate position (close to where the double-click happened)
    auto p = document()->documentLayout()->hitTest(event->pos(), Qt::FuzzyHit);
    auto cursor = textCursor();
    cursor.setPosition(p);
    setTextCursor(cursor);

    QGraphicsTextItem::mouseDoubleClickEvent(event);

【讨论】:

更新问题以包含有关双击编辑的链接部分。如果我不使用QGraphicsTextItem::paint(),那么我应该将光标应用于什么?正如我在问题中提到的那样,代码清楚地表明,我没有打电话给QGraphicsTextItem::paint()。如果我是,光标将定位在鼠标坐标处,我不必移动它。我想实现这种行为。 (甚至_cursor.movePosition(QTextCursor::StartOfWord); 也可以) - 问题是我没有办法设置光标。正如我的问题标题所说。 请检查我的更新。这允许您在光标位于双击位置的情况下双击时进入编辑模式。 谢谢,QGraphicTextItem 的默认行为是编辑在光标位置。但是由于我必须实现自己的绘画,所以光标不再起作用。这就是问题所在。

以上是关于编辑文本 - 如何更改光标位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 中确定文本光标位置

如何获取可编辑div或body里光标的像素位置?

如果设置Div 编辑器的光标位置?

编辑控件 MFC 中光标位置更改时是不是有通知代码?

如何从 RichTextBox 中的光标位置选择前一个字符

反应本机文本输入,按下时更改光标位置