2015-07-01 7 views
1

Я хочу сделать 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 (I ., вероятно, хотите, последний) Тогда я дважды щелкните еще раз, и я могу ввести, чтобы добавить или удалить текст

это поведение, которое пользователь, вероятно, не ожидал -.. и ничего я, кажется, чтобы изменить его

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

ответ

0

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

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

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