c++ - QGraphicsTextItem 编辑需要执行两次操作

标签 c++ qt text editing qgraphicstextitem

我想使 QGraphicsTextItem 在双击时可编辑,并在我单击时使其可移动。

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

class TextItem: public QGraphicsTextItem
{
public:
    TextItem()
    {
        setPlainText("hello world");
        QFont f;
        f.setPointSize(50);
        f.setBold(true);
        f.setFamily("Helvetica");
        setFont(f);

        setFlags(QGraphicsItem::ItemIsMovable    |
                 QGraphicsItem::ItemIsFocusable  |
                 QGraphicsItem::ItemIsSelectable);
        setTextInteractionFlags(Qt::NoTextInteraction);
    }
    virtual void paint(QPainter* painter,
                       const QStyleOptionGraphicsItem* option,
                       QWidget* widget = NULL)
    {
        QGraphicsTextItem::paint(painter, option, widget);
    }

protected:
    virtual void focusOutEvent (QFocusEvent * event)
    {
        Q_UNUSED(event);
        setTextInteractionFlags(Qt::NoTextInteraction);
    }
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
    {
        Q_UNUSED(event);
        setTextInteractionFlags(Qt::TextEditable); // TextEditorInteraction
    }
};

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();
}

它做我想做的——除了我必须双击两次
- 第一次双击时,我看到一个光标但无法编辑文本(使用任一选项 TextEditableTextEditorInteraction(我可能想要后者)。然后我加倍- 再次单击,我可以键入以添加或删除文本。

这是一种用户可能不期望的行为 - 而且我所做的任何事情似乎都无法改变它。

我是不是做错了什么,或者有什么我需要补充的吗?

最佳答案

我希望在可聚焦的项目上进行鼠标操作,使其自动聚焦。我想不是...

mouseDoubleClickEvent 中,我添加了对 setFocus() 的调用

virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
{
    Q_UNUSED(event);
    setTextInteractionFlags(Qt::TextEditorInteraction); 
    setFocus();
}

关于c++ - QGraphicsTextItem 编辑需要执行两次操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171569/

相关文章:

javascript - 专用于文本的幻灯片放映/持续播放/但带有 "back"、 "stop"和 "forward"按钮的图像文件

java - 将文本文件拆分为 block

c++ - 64位减法结果转32位整数

c++ - 在线程中等待一段时间,或者直到条件发生

c++ - 这行代码在 C++ 类中是什么意思?

c++ - 连续光线转换之间的时间延迟

text - NLP 寻找实体之间的关系

c++ - 为什么在 C++ 中的容器中存储引用(不是指针)不起作用?

c++ - 手工编码 GUI 与 Qt 设计器 GUI

c++ - 想在 Qt 中存储配置文件,使用 SQLite 或其他东西?