QLineEdit не может установить ярлыки, когда он в фокусе

Я реализую текстовую программу дел. у меня есть CommandInput виджет, который наследуется от QLineEdit, В основном есть несколько команд, начиная с ключевых слов «добавить», «удалить», «изменить» и еще несколько.

Я хочу реализовать несколько ярлыков.

  1. Ctrl+A так что когда виджет имеет фокус, я могу setText("add \"\""), курсор на второй последней позиции, так что, кажется, add "|"
  2. Tab так что когда виджет имеет фокус, когда пользователь вводит первое ключевое слово, например, addтогда я могу выполнить команду add "|"

Ключевая проблема заключается в том, что, когда виджет имеет фокус, ярлыки не работают. Я пробовал следующие способы:

1 / Переопределить keyPressEvent, Tab ключ не работает, как задумано. И даже если это работает, я не знаю, как это сделать для последовательности ключей вроде Ctrl+A,

void CommandInput::keyPressEvent(QKeyEvent *keyEvent)

{
switch(keyEvent->key())
{
case Qt::Key_Tab;
emit add_activated();
default:
QLineEdit::keyPressEvent(keyEvent);
}
}

2 / Создать ярлыки при инициализации. Это тоже не работает.

CommandInput::CommandInput(QWidget *parent)
: QLineEdit(parent)
{
tab_shortcut = new QShortcut(QKeySequence("Tab"),this);
add_shortcut = new QShortcut(QKeySequence("Ctrl+A"),this);

connect(tab_shortcut, SIGNAL(activated()),
this, SIGNAL(tab_activated()));
connect(add_shortcut, SIGNAL(activated()),
this, SIGNAL(add_activated()));
}

Надеюсь, вы могли бы помочь мне в этом вопросе. Спасибо!

3

Решение

Переопределение keyPressEvent вероятно, предпочтительный подход здесь. Я предполагаю, что причина, по которой «Tab» не работает должным образом, заключается в том, что у вас нет break заявление после выпуска add_activated(), Для «Ctrl + A», вам придется посмотреть на modifiers() для ключевого события. Таким образом, ваш keyPressEvent будет выглядеть примерно так:

void CommandInput::keyPressEvent(QKeyEvent* keyEvent)
{
if (keyEvent->key() == Qt::Key_Tab)
{
emit add_activated();
}
else if (keyEvent->key() == Qt::Key_A &&
keyEvent->modifiers() == Qt::ControlModifier)
{
// Code for Ctrl+A goes here.
}
else
{
QLineEdit::keyPressEvent(keyEvent);
}
}

Кажется, это работает на моей машине (Linux).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]