Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 我应该使用KeyPressEvent或QAction来实现按键操作吗?_Qt_Keyboard_Keyboard Events - Fatal编程技术网

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

Qt 我应该使用KeyPressEvent或QAction来实现按键操作吗?,qt,keyboard,keyboard-events,Qt,Keyboard,Keyboard Events,在Qt中,无论是实现keyPressEvent还是创建QAction并为其分配组合键,都允许我根据键盘进行操作 以下哪种方法通常是首选的 将取决于您需要它做什么 这是一个类似于菜单的动作,它也可能由菜单、按钮、工具栏触发,然后进行QAction。尤其是如果此操作应该在整个程序中都有效,而不仅仅是在单个小部件中 它是否更像单个小部件中的本地活动(例如控制游戏中的移动),我会使用按键事件。我更喜欢覆盖按键事件。我不喜欢那种“到处乱跑”的想法。只需覆盖键,然后按edevent。我通常用开关盒检查按下的

在Qt中,无论是实现keyPressEvent还是创建QAction并为其分配组合键,都允许我根据键盘进行操作


以下哪种方法通常是首选的

将取决于您需要它做什么

这是一个类似于菜单的动作,它也可能由菜单、按钮、工具栏触发,然后进行QAction。尤其是如果此操作应该在整个程序中都有效,而不仅仅是在单个小部件中


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

我更喜欢覆盖
按键事件。我不喜欢那种“到处乱跑”的想法。只需覆盖
键,然后按edevent
。我通常用开关盒检查按下的键。如果不想禁用密钥的标准行为,请不要忘记调用基类的keyPressEvent。此外,您还可以检查在发生
按键事件时是否按下了“修改器”。(例如Shift或Ctrl)。IMHO在一般情况下覆盖按键事件比创建不可见的秘密操作要好,除非您希望应用程序包含所有用户可见的操作

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。通过这种方式,您可以在几个小部件上使用相同的操作,这些小部件应该执行相同的操作

摘录自:

QAction类提供了一个抽象 用户界面操作可以是 插入到小部件中

在应用程序中,有许多常用命令 可以通过菜单、工具栏按钮和 键盘快捷键。因为用户 期望执行每个命令 以同样的方式,不管 使用的用户界面,有助于 将每个命令表示为一个操作


此外,QAction可以更轻松地覆盖要在运行时使用的键组合。当然,使用其他方法也可以实现这一点,但难度更大。