Должен ли я использовать KeyPressEvent или QAction для реализации нажатий клавиш?
В Qt реализация keyPressEvent или создание QAction и назначение ему комбинации клавиш позволяют мне действовать на основе клавиатуры.
Какой из этих методов обычно предпочтительнее?
3 ответа
Вы должны использовать QAction всякий раз, когда одно и то же событие, которое запускается желаемой последовательностью клавиш, может быть вызвано другими способами, например, из меню, панели инструментов или других кнопок. Таким образом, вы можете использовать одно и то же действие на нескольких виджетах, которые должны выполнять один и тот же трюк.
Выдержка из документа QAction:
Класс QAction предоставляет абстрактное действие пользовательского интерфейса, которое можно вставить в виджеты.
В приложениях многие общие команды могут быть вызваны через меню, кнопки панели инструментов и сочетания клавиш. Поскольку пользователь ожидает, что каждая команда будет выполняться одинаково, независимо от используемого пользовательского интерфейса, полезно представлять каждую команду как действие.
Я бы предпочел перезаписать keyPressEvent
, Мне не нравится идея QAction
"валяется где-то". Просто переписать keyPressedEvent
, Я обычно делаю это с выключателем, в котором я проверяю нажатую клавишу. Просто не забудьте вызвать keyPressEvent базового класса, если вы не хотите отключать стандартное поведение ключа. Кроме того, вы можете проверить, нажимается ли "модификатор" во время keyPressEvent
происходит. (например, Shift или Ctrl). ИМХО для общих целей перезаписываю keyPressEvent
это лучше, чем создавать невидимые, секретные действия, если только вы не хотите, чтобы ваше приложение содержало все эти действия, видимые для пользователя.
void my_widget::keyPressEvent( QKeyEvent* p_event )
{
bool ctrl_pressed = false;
if( p_event->modifiers() == Qt::ControlModifier )
{
ctrl_pressed = true;
}
switch( p_event->key() )
{
case Qt::Key_F:
focus_view();
break;
case Qt::Key_I:
if( ctrl_pressed )
{
toggle_interface();
}
else
{
QWidget::keyPressEvent( p_event );
}
break;
case Qt::Key_Return: // return key
case Qt::Key_Enter: // numpad enter key
update_something();
break;
default:
QSpinBox::keyPressEvent( p_event );
}
}
Зависит от того, для чего это нужно.
Это для меню, как действие, которое может быть вызвано меню, кнопкой или панелью инструментов, а затем перейти к QAction. Особенно, если это действие должно работать во всей вашей программе, а не только в одном виджете.
Если бы это больше походило на локальную активность в одном виджете (например, управление движением в игре), я бы использовал событие нажатия клавиши.