如何在QGraphicsTextItem上首次双击动作时显示我的插入符号?

时间:2015-09-01 15:36:15

标签: qt cursor text-editor qgraphicsitem qgraphicstextitem

我正在努力让QGraphicsTextItem成为用户友好的对象 由于在可编辑时很难移动,因此我将其设置为不可编辑,并在双击时使其可编辑。然后在失去焦点时关闭编辑。

我的问题是,插入符号在第一次编辑时没有出现 我尝试根据鼠标位置获取位置(如此question试图解决其他问题)或调用QGraphicsTextItem::mouseDoubleClickEvent(event);

无论我尝试什么,插入符号在第一次操作时都是不可见的 - 直到我开始输入(或者如果我将注意力集中并重新进入) - 即使它位于正确的位置。

输入或取消选择并重新选择后,插入符号每次都会显示在正常位置。

我试图在项目构造函数中调用QTextCursor,将其位置设置为0,没有任何区别。

有什么不同:两种情况中的一种(我不能做到这两种情况):
a)在构造函数中以Qt::TextEditorInteraction开始项目 b)启动没有移动/聚焦/可选标志的项目

我也做不到 - 因为我的项目默认状态必须是可移动的,这会干扰文本编辑(如开头所述)。
我试图在编辑过程中禁用这些标志,但没有效果。

这是一个简单的代码来演示这个问题,我希望有人可以有个想法。

  

mytextitem.h

#ifndef TEXTITEM_H
#define TEXTITEM_H
#include <QGraphicsTextItem>

class MyTextItem : public QGraphicsTextItem
{
Q_OBJECT
public:
    MyTextItem();
protected:
    virtual void focusOutEvent (QFocusEvent * event);
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event);
};
#endif // TEXTITEM_H
  

mytextitem.cpp

#include "mytextitem.h"
#include <QTextCursor>
#include <QAbstractTextDocumentLayout>
#include <QGraphicsSceneMouseEvent>
#include <QFont>

MyTextItem::MyTextItem()
{
    setHtml("ABCD");
    setFont(QFont("Arial", 50));
    setTextInteractionFlags(Qt::NoTextInteraction);
    setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
}

void MyTextItem::focusOutEvent(QFocusEvent *event)
{
    Q_UNUSED(event);
    setTextInteractionFlags(Qt::NoTextInteraction);
    QTextCursor _cursor = textCursor();
    _cursor.clearSelection();
    setTextCursor(_cursor);
}

void MyTextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
    setTextInteractionFlags(Qt::TextEditorInteraction);
    QGraphicsTextItem::mouseDoubleClickEvent(event);   // or the version in linked question
}
  

的main.cpp

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

    QApplication app(argc, argv);
    QGraphicsScene s;
    QGraphicsView view(&s);
    s.setSceneRect(-20, -100, 800, 600);
    view.show();
    MyTextItem* t = new MyTextItem();
    s.addItem(t);
    return app.exec();
}

我还考虑过编辑文本 - 不确定这是否会起作用,但我认为它会影响撤销堆栈,我将很快处理它....

如何让我的插入符号显示在文本项的第一次双击操作上?

(作为一个用户,没有看到插入符号会让我不确定我是否可以键入...即使它有效...如果我没有对行动的反馈,我对该对象没有信心。这就是为什么我关心这个问题。)

1 个答案:

答案 0 :(得分:0)

我无法解释它...在尝试了所有事情以使插入符号显示之后,解决方案非常简单:
我必须在构造函数中更改正在设置的标志的顺序。

必须在设置#include标志后设置QGraphicsTextItem标志。

QGraphicsItem