Должен ли я использовать KeyPressEvent или QAction для реализации нажатий клавиш? - PullRequest
3 голосов
/ 26 января 2011

В Qt реализация keyPressEvent или создание QAction и назначение ему комбинации клавиш позволяют мне действовать на основе клавиатуры.

Какой из этих методов обычно предпочтительнее?

Ответы [ 3 ]

5 голосов
/ 26 января 2011

Вы должны использовать QAction всякий раз, когда то же событие, которое запускается желаемой последовательностью клавиш, может быть вызвано другими способами, например, из меню, панели инструментов или других кнопок.Таким образом, вы можете использовать одно и то же действие для нескольких виджетов, которые должны выполнять один и тот же трюк.

Выдержка из QAction doc :

Класс QAction предоставляет абстрактныйдействие пользовательского интерфейса, которое может быть вставлено в виджеты.

В приложениях многие общие команды могут вызываться через меню, кнопки панели инструментов и сочетания клавиш.Поскольку пользователь ожидает, что каждая команда будет выполняться одинаково, независимо от используемого пользовательского интерфейса, полезно представлять каждую команду как действие.

2 голосов
/ 26 января 2011

Я бы предпочел перезаписать 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 );
    }
}
1 голос
/ 26 января 2011

Зависит от того, для чего это нужно.

Это для действия, подобного меню, которое может быть вызвано меню, кнопкой или панелью инструментов, а затем перейти к QAction. Особенно, если это действие должно работать во всей вашей программе, а не только в одном виджете.

Если это больше похоже на локальную активность в одном виджете (например, управление движением в игре), я бы использовал событие нажатия клавиши.

...