Редактирование 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();
}

Он делает то, что я хочу - за исключением того, что мне нужно дважды щелкнуть дважды
- в первый раз, когда я дважды щелкаю, я вижу курсор, но не могу редактировать текст (с любой опцией, TextEditable или TextEditorInteraction (я, вероятно, хочу последний). Затем я снова дважды щелкаю и могу ввести текст, чтобы добавить или удалить его.

Это поведение, которого пользователь, вероятно, не ожидает, и ничто из того, что я делаю, не меняет его.

Я что-то не так делаю, или нужно что-то добавить?


person Thalia    schedule 01.07.2015    source источник


Ответы (1)


Я ожидал, что действие мыши на элементе, на который можно сфокусироваться, автоматически наделит его фокусом. Я думаю, нет...

В mouseDoubleClickEvent я добавил вызов setFocus()

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