Jak ustawić focus za pomocą klawiszy strzałek?

0

Na komputerze embedded mam tylko 6 przycisków: 4x strzałki , Ok, Esc i aplikacja Qt

Trzy pola do wprowadzenia wartości liczbowej
Key_Up/Key_Down zmieniają wartość

image

Jak ustawić "fokus" klawiszami Key_Left/Key_Right ? w filozofii Qt

#pragma once

#include <QWidget>
#include <QDebug>
#include <QKeyEvent>
#include <QLineEdit>

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr)
    {
        lineEdit1 = new QLineEdit(this);
        lineEdit1->move(0,0);

        lineEdit2 = new QLineEdit(this);
        lineEdit2->move(45,45);

        lineEdit3 = new QLineEdit(this);
        lineEdit3->move(90,90);
        // installEventFilter(this);
    }
    virtual ~Widget(){};

protected:
    void keyPressEvent(QKeyEvent *event) override
    {
        qDebug()<<  "Widget::keyPressEvent" << event;

        auto *focused_widget = qobject_cast<QLineEdit*>(QWidget::focusWidget());
        if(focused_widget)
        {

            int num = focused_widget->text().toInt();

            if(event->key()==Qt::Key_Up) num++;
            if(event->key()==Qt::Key_Down) num--;

            if(event->key()==Qt::Key_F2) this->focusPreviousChild();
            if(event->key()==Qt::Key_F3) this->focusNextChild();

            focused_widget->setText(QString::number(num));
        }

        QWidget::keyPressEvent(event);
    };

    bool eventFilter(QObject *obj, QEvent *evt)  override{
        qDebug()<< "Widget::eventFilter " << evt;
        return QWidget::eventFilter(obj, evt);
    };

private:
    QLineEdit *lineEdit1{nullptr};
    QLineEdit *lineEdit2{nullptr};
    QLineEdit *lineEdit3{nullptr};
};

keyPressEvent nie przechwytuje klawiszy Key_Left/Key_Right

Jakie sa opcję ?
installEventFilter(this)

0

Pomiędzy tymi oknami ma się skakać zamiast tab to za pomocą strzałek?

1

Napisać Event filter:

#ifndef UPDONWARRORSFILTER_H
#define UPDONWARRORSFILTER_H

#include <QObject>

class UpDonwArrorsFilter : public QObject
{
    Q_OBJECT
public:
    explicit UpDonwArrorsFilter(QObject *parent = nullptr);

    bool eventFilter(QObject *watched, QEvent *event) override;

signals:

};

#endif // UPDONWARRORSFILTER_H
#include "updonwarrorsfilter.h"
#include <QKeyEvent>
#include <QWidget>

UpDonwArrorsFilter::UpDonwArrorsFilter(QObject *parent)
    : QObject{parent}
{
}

bool UpDonwArrorsFilter::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        auto keyEvent = static_cast<QKeyEvent *>(event);

        if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down)
        {
            auto widget = qobject_cast<QWidget*>(watched);
            if (widget)
            {
                QWidget* nextFocusWidget = (keyEvent->key() == Qt::Key_Down) ?
                                               widget->nextInFocusChain() : widget->previousInFocusChain();
                nextFocusWidget->setFocus();
                return true;
            }
        }
    }
    return false;
}

Zainstalować go na tych edytorach:

    Widget(QWidget *parent = nullptr)
    {
        lineEdit1 = new QLineEdit(this);
        lineEdit1->move(0,0);

        lineEdit2 = new QLineEdit(this);
        lineEdit2->move(45,45);

        lineEdit3 = new QLineEdit(this);
        lineEdit3->move(90,90);
        
        auto filter = new UpDonwArrorsFilter(this);
        lineEdit1->installEventFilter(filter);
        lineEdit2->installEventFilter(filter);
        lineEdit3->installEventFilter(filter);
    }

Trzeba przetratować czy nie ma czegoś za dużo w ciągu itemów, które mogą mieć focus.
Jak to testowałem to u siebie używając standardowego MainWindow to widget->previousInFocusChain() zwracało mi coś "centraWidget" jak bylem na pierwszym edytorze - w twoim kodzie może zadziałać od razu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1