Qt. Установка фокуса кнопке, при обработке keyPressEvent у Key_Down-Key_Up

72
06 апреля 2021, 01:30

Есть форма, на которой расположены несколько кнопок с именами "up", "down", и т.д

Необходимо обрабатывать нажатия на стрелки (key_up и т.д.). Собственно сами ивенты я ловлю успешно таким вот образом.

bool ClientWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = dynamic_cast<QKeyEvent*>(event);
        this->keyPressEvent(keyEvent);
    }
    return QObject::eventFilter(obj, event);
}

Проблема в том, что я хочу в keyPressEvent установить фокус у нужной кнопки, но:

1) Если я возвращаю из eventFilter при обработке нажатия true, то фокуса у кнопок вообще нет.

2) А если возвращаю QObject::eventFilter(obj, event);, то само собой setFocus в keyPressEvent работает не совсем как надо, так как в итоге фокус передается следующему объекту.

Как обработать этот случай правильней всего?

Answer 1

Переопределить функции focusNextPrevChild() у ClientWindow:

bool 
ClientWindow::
focusNextPrevChild(bool next)
{
    return false;
}

Реализация eventFilter() у меня:

bool
ClientWindow::
eventFilter(QObject *watched, QEvent *e)
{
    if (e->type() == QEvent::KeyPress)
    {
        if(watched->objectName() == "ClientWindowWindow") {
            ui->up->setStyleSheet("");    ui->down->setStyleSheet("");
            ui->left->setStyleSheet("");  ui->right->setStyleSheet("");
            QKeyEvent* event = static_cast<QKeyEvent*>(e);
            switch(event->key()) {
            case Qt::Key_Up: ui->up->setFocus(); ui->up->setStyleSheet("border: 1px solid red;") ;break;
            case Qt::Key_Down: ui->down->setFocus(); ui->down->setStyleSheet("border: 1px solid red;"); break;
            case Qt::Key_Left: ui->left->setFocus(); ui->left->setStyleSheet("border: 1px solid red;"); break;
            case Qt::Key_Right: ui->right->setFocus(); ui->right->setStyleSheet("border: 1px solid red;"); break;
            }
        }
    }
    return QObject::eventFilter(watched, e);
}

Фильтр установить в конструкторе на qApp:

qApp->installEventFilter(this);
READ ALSO
Как получить список всех разделов в Windows?

Как получить список всех разделов в Windows?

Хочу получить информацию о дисках и разделах в windowsИспользовала функцию GetLogicalDrives(), но оттуда я могу взять только именованные разделы

126
Как разместить текст по центру на SVG Path

Как разместить текст по центру на SVG Path

Когда я использую SVG, чтобы нарисовать цикл и поместить текст, то как центрировать текст на SVG Path?

83
Как сделать поиски статей на сайте?

Как сделать поиски статей на сайте?

Есть вариант с помощью order_by или filterНужно сортировать данные из базы данных точнее статьи

109
Помощь с CSS выравниванием

Помощь с CSS выравниванием

Встала проблема с выравниванием блоков как на картинкеПомогите пожалуйста с решением, какими способами это можно сделать? Сайт верстаю на Bootstrap4

118