Я реализую текстовую программу дел. у меня есть CommandInput
виджет, который наследуется от QLineEdit
, В основном есть несколько команд, начиная с ключевых слов «добавить», «удалить», «изменить» и еще несколько.
Я хочу реализовать несколько ярлыков.
Ctrl+A
так что когда виджет имеет фокус, я могу setText("add \"\"")
, курсор на второй последней позиции, так что, кажется, add "|"
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()));
}
Надеюсь, вы могли бы помочь мне в этом вопросе. Спасибо!
Переопределение 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).
Других решений пока нет …