我怎样才能让我的插入符号出现在 QGraphicsTextItem 上的第一次双击操作中?
How can I get my caret to show up on first double-click action on a QGraphicsTextItem?
我正在努力让 QGraphicsTextItem
成为用户友好的对象。
由于可编辑时很难移动,所以我将其设置为不可编辑,然后双击使其可编辑。然后在失去焦点时关闭编辑。
我的问题是,第一次编辑时插入符号没有出现。
我已经尝试根据鼠标位置获取位置(如试图解决不同问题的 ),或调用 QGraphicsTextItem::mouseDoubleClickEvent(event);
无论我尝试什么,插入符号在第一次操作时都是不可见的 - 直到我开始输入(或者如果我聚焦并返回) - 即使它位于正确的位置。
键入或取消选择并重新选择后,插入符号每次都会出现在正常位置。
我试过在项目构造函数中调用 QTextCursor,将其位置设置为 0,没有任何区别。
有什么不同:两种情况之一(虽然我都做不到):
a) 在构造函数
中以 Qt::TextEditorInteraction
开始项目
b) 开始项目没有 moving/focus/selectable 标志
我也做不到 - 因为我的项目默认状态必须是可移动的,这会干扰文本编辑(如开头所述)。
我试图在编辑过程中禁用这些标志,但没有效果。
这里有一个简单的代码来演示这个问题,希望有人能出出主意。
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();
}
我也考虑过编辑文本 - 不确定是否可行,但我认为这会影响撤消堆栈,我将很快处理它....
如何让我的插入符在第一次双击文本项时显示?
(作为用户,看不到插入符号会让我不确定我是否可以输入...即使它有效...如果我没有对我的操作的反馈,我将不会对该对象充满信心。这就是我关心这个问题的原因。)
我无法解释...在尝试了所有方法让插入符显示之后,解决方案非常简单:
我不得不在构造函数中更改设置标志的顺序。
必须在设置 QGraphicsItem
标志后设置 QGraphicsTextItem
标志。
setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
setTextInteractionFlags(Qt::NoTextInteraction);
我正在努力让 QGraphicsTextItem
成为用户友好的对象。
由于可编辑时很难移动,所以我将其设置为不可编辑,然后双击使其可编辑。然后在失去焦点时关闭编辑。
我的问题是,第一次编辑时插入符号没有出现。
我已经尝试根据鼠标位置获取位置(如试图解决不同问题的 QGraphicsTextItem::mouseDoubleClickEvent(event);
无论我尝试什么,插入符号在第一次操作时都是不可见的 - 直到我开始输入(或者如果我聚焦并返回) - 即使它位于正确的位置。
键入或取消选择并重新选择后,插入符号每次都会出现在正常位置。
我试过在项目构造函数中调用 QTextCursor,将其位置设置为 0,没有任何区别。
有什么不同:两种情况之一(虽然我都做不到):
a) 在构造函数
中以 Qt::TextEditorInteraction
开始项目
b) 开始项目没有 moving/focus/selectable 标志
我也做不到 - 因为我的项目默认状态必须是可移动的,这会干扰文本编辑(如开头所述)。
我试图在编辑过程中禁用这些标志,但没有效果。
这里有一个简单的代码来演示这个问题,希望有人能出出主意。
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();
}
我也考虑过编辑文本 - 不确定是否可行,但我认为这会影响撤消堆栈,我将很快处理它....
如何让我的插入符在第一次双击文本项时显示?
(作为用户,看不到插入符号会让我不确定我是否可以输入...即使它有效...如果我没有对我的操作的反馈,我将不会对该对象充满信心。这就是我关心这个问题的原因。)
我无法解释...在尝试了所有方法让插入符显示之后,解决方案非常简单:
我不得不在构造函数中更改设置标志的顺序。
必须在设置 QGraphicsItem
标志后设置 QGraphicsTextItem
标志。
setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable);
setTextInteractionFlags(Qt::NoTextInteraction);