我应该使用KeyPressEvent或QAction来实现按键吗?

时间:2011-01-26 01:23:57

标签: qt keyboard keyboard-events

在Qt中,无论是实现keyPressEvent还是创建QAction并为其指定一个组合键,我都可以根据键盘进行操作。

通常首选哪种方法?

3 个答案:

答案 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。特别是如果此操作应该在您的程序中运行,而不仅仅在单个小部件中。

它更像是一个小部件中的本地活动(例如控制游戏中的移动),我会使用按键事件。