Задача проста: необходимо обрабатывать keyPressEvent() и проверять на нажатие клавиш Qt::Key_Return/Qt::Key_Enter и Qt::Key_Escape.
1) По нажатию Qt::Key_Return/Qt::Key_Enter войти в режим редактирования(или выйти, если уже в режиме редактирования) и выделить весь текст.
2) По нажатию Qt::Key_Escape выйти из режима редактирования и снять выделение текста.
Проблемы 2:
1) keyPressEvent() перестаёт срабатывать после первого входа/выхода в режим редактирования.
2) Непонятки с выделением текста: иногда выделение не снимается + цвет выделения так же иногда глючит, т.е вместо стандартного Qt::darkBlue этот:
http://savepic.su/75570.jpgQt 4.7.4 MSVS 2008 SP1.
C++ (Qt)
MyGraphicsTextItem::MyGraphicsTextItem( const QString &text, QGraphicsItem *parent /*= 0*/, QGraphicsScene *scene /*= 0*/ )
: QGraphicsTextItem(text, parent, scene)
{
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
}
void MyGraphicsTextItem::keyPressEvent( QKeyEvent *event )
{
switch (event->key()) {
case Qt::Key_Return:
case Qt::Key_Enter:
if (textInteractionFlags() & Qt::TextEditorInteraction) {
setTextInteractionFlags(Qt::NoTextInteraction);
QTextCursor cursor = textCursor();
cursor.clearSelection();
setTextCursor(cursor);
setSelected(false);
} else {
m_oldText = toPlainText();
setTextInteractionFlags(Qt::TextEditorInteraction);
// Выделить всё
QTextCursor cursor = textCursor();
cursor.select(QTextCursor::Document);
setTextCursor(cursor);
}
return;
case Qt::Key_Escape:
if (textInteractionFlags() & Qt::TextEditorInteraction) {
setTextInteractionFlags(Qt::NoTextInteraction);
setPlainText(m_oldText);
// Снять выделение
QTextCursor cursor = textCursor();
cursor.clearSelection();
setTextCursor(cursor);
setSelected(false);
return;
}
}
QGraphicsTextItem::keyPressEvent(event);
}