在Qt中,无论是实现keyPressEvent还是创建QAction并为其指定一个组合键,我都可以根据键盘进行操作。
通常首选哪种方法?
答案 0 :(得分:5)
每当您想要的键序列触发的同一事件可能通过菜单,工具栏或其他按钮等其他方式触发时,您应该使用QAction。通过这种方式,您可以对应该执行相同操作的多个小部件使用相同的操作。
摘自QAction doc:
QAction类提供了一个摘要 可以是用户界面操作 插入小部件。
在应用程序中有许多常用命令 可以通过菜单,工具栏按钮和 键盘快捷键。自用户 期望执行每个命令 以同样的方式,无论如何 使用的用户界面,它很有用 将每个命令表示为一个动作。
答案 1 :(得分:2)
我更愿意覆盖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 );
}
}
答案 2 :(得分:1)
取决于你需要它。
是否可以通过菜单,按钮,工具栏触发类似操作的菜单,然后进行QAction。特别是如果此操作应该在您的程序中运行,而不仅仅在单个小部件中。
它更像是一个小部件中的本地活动(例如控制游戏中的移动),我会使用按键事件。