2016-08-29 4 views
2

У меня есть QGraphicsTextItem себя как lineedit, используяКак сделать QGraphicsTextItem одной строкой?

setTextInteractionFlags(Qt::TextEditorInteraction); 

Однако он будет показывать многострочный, если пользователь нажимает ввод. Я хочу, чтобы он игнорировал переносы строк, как это сделать?

+0

я не могу попробовать прямо сейчас, так что я пишу только комментарий, но вы можете получить доступ к QTextDocument в QGraphicsTextItem (QGraphicsTextItem :: документ()). Вы можете попытаться установить режим переноса слов документа в QTextOption :: NoWrap, чтобы установить правильный QTextOption с помощью метода QTextDocument :: setDefaultTextOption() – Fabio

ответ

2

AFAIK QGraphicsTextItem не реализует эту функциональность. Вы можете сделать трюк подклассов QGraphicsTextItem и фильтр событий клавиатуры:

class MyGraphicsTextItem : public QGraphicsTextItem 
{ 

// ... 

protected: 

    virtual void keyPressEvent(QKeyEvent* e) override 
    { 
     if (e->key() != Qt::Key_Return) 
     { 
      // let parent implementation handle the event 
      QGraphicsTextItem::keyPressEvent(e); 
     } 
     else 
     { 
      // ignore the event and stop its propagation 
      e->accept(); 
     } 
    } 
}; 
2

Я в конечном итоге, используя следующий код. Такая же идея, как @wasthishelpful.

class GraphicsLineEditItem : public QGraphicsTextItem { 
    Q_OBJECT 
public: 
    explicit GraphicsLineEditItem(QGraphicsItem *parent = 0) : QGraphicsTextItem(parent) 
    { setTextInteractionFlags(Qt::TextEditorInteraction); } 

signals: 
    void returnPressed(); 

protected: 
    void keyPressEvent(QKeyEvent *event) { 
     switch (event->key()) { 
     case Qt::Key_Return: 
     case Qt::Key_Enter: 
      emit returnPressed(); 
      break; 
     default: 
      QGraphicsTextItem::keyPressEvent(event); 
     } 
    } 
}; 
Смежные вопросы