PyQt PySide Менять фокус стрелками, а не tab'ом. Смена стиля при смене фокуса

Вопрос 1: Есть 3 простых виджета. Каждый из них при попадании в фокус должен получать стиль. Такое не работает:

if self.btn.hasFocus():
    self.setStyleSheet(st)

Можно сделать по отдельному классу для каждого виджета и там прописать

def focusInEvent(self, e):
    self.setStyleSheet(st)
def focusOutEvent(self, e):
    self.setStyleSheet(" ")
    

Работает, но не подходит.

Вопрос 2. Как переопределить поведение стрелок влево-вправо и ходить между виджетами стрелками, а не tab\tab+shift.

from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
import sys

st = "border: 3px solid; border-color:red;"

class InFocus(QWidget):
    def __init__(self, parent=None):
        super(InFocus, self).__init__(parent)
        hbox = QHBoxLayout()
        self.btn = QPushButton()
        self.le = QLineEdit()
        self.sb = QSpinBox()
        hbox.addWidget(self.btn)
        hbox.addWidget(self.le)
        hbox.addWidget(self.sb)
        self.setLayout(hbox)

    def keyPressEvent(self, keyEvent):
        super().keyPressEvent(keyEvent)
        key = keyEvent.key()
        if key == Qt.Key_Right:
            pass                   # tab
        elif key == Qt.Key_Left:
            pass                   # tab+shift


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = InFocus()
    w.resize(300, 100)
    w.show()
    sys.exit(app.exec())

Ответы (2 шт):

Автор решения: Garp

Нашёл ответ на первый вопрос

st = """QPushButton{ background-color: cyan; }
        QPushButton:focus{background-color: 
             cyan;border: 2px solid; border-color:brown;}"""
self.btn.setStyleSheet(st)

И так для каждого виджета.

→ Ссылка
Автор решения: S. Nick

Попробуйте переопределить метод keyPressEvent() в подклассах ваших виджетов.

import sys
'''
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
'''
from PyQt5.Qt import *


class LineEdit(QLineEdit):
    def __init__(self, text, parent=None):
        super(LineEdit, self).__init__(parent)
        self.widget_left = ...
        self.widget_right = ...
        self.setText(text)
            
    def keyPressEvent(self, keyEvent):
        super().keyPressEvent(keyEvent) 
        key = keyEvent.key()
        if key == Qt.Key_Left:
            self.widget_left.setFocus()
        elif key == Qt.Key_Right:
            self.widget_right.setFocus() 


class PushButton(QPushButton):
    def __init__(self, text, widget_left, widget_right, parent=None):
        super(PushButton, self).__init__(parent)
        self.setText(text)
        self.widget_left = widget_left
        self.widget_right = widget_right

    def keyPressEvent(self, event): 
        super(PushButton, self).keyPressEvent(event)
        if event.key() == Qt.Key_Right:     
            self.widget_right.setFocus()
        elif event.key() == Qt.Key_Left:  
            self.widget_left.setFocus()


class SpinBox(QSpinBox):
    def __init__(self, widget_left, widget_right, parent=None):
        super(SpinBox, self).__init__(parent)
        self.widget_left = widget_left
        self.widget_right = widget_right
 
    def keyPressEvent(self, event): 
        super(SpinBox, self).keyPressEvent(event)
        if event.key() == Qt.Key_Right:     
            self.widget_right.setFocus()
        elif event.key() == Qt.Key_Left:     
            self.widget_left.setFocus()
            
            
class Label(QLabel):
    def __init__(self, text, parent=None):
        super(Label, self).__init__(parent)
        self.setText(text)
        self.parent = parent
        self.widget_left = ...
        self.widget_right = ...

    def keyPressEvent(self, event): 
        super(Label, self).keyPressEvent(event)
        if event.key() == Qt.Key_Right:     
            self.widget_right.setFocus()
        elif event.key() == Qt.Key_Left:     
            self.widget_left.setFocus()
            

class InFocus(QWidget):
    def __init__(self, parent=None):
        super(InFocus, self).__init__(parent)
        
        self.label = Label('Label 1', self)
        self.label2 = Label('Label 2', self)
        self.label3 = Label('Label 3', self)
        self.le = LineEdit('Hello QLineEdit', self)  
        self.btn = PushButton('btn1', self.label3, self.label, self)
        self.btn2 = PushButton('btn2', self.label, self.label2, self)
        self.btn3 = PushButton('btn3', self.label2, self.le, self)
        self.sb = SpinBox(self.le, self.label3, self)
        
        self.label.widget_left = self.btn
        self.label.widget_right = self.btn2
        self.label2.widget_left = self.btn2
        self.label2.widget_right = self.btn3
        self.le.widget_left = self.btn3
        self.le.widget_right = self.sb
        self.label3.widget_left = self.sb
        self.label3.widget_right = self.btn        
        
        hbox = QHBoxLayout(self)
        hbox.addWidget(self.btn)
        hbox.addWidget(self.label)
        hbox.addWidget(self.btn2)
        hbox.addWidget(self.label2)
        hbox.addWidget(self.btn3)
        hbox.addWidget(self.le)
        hbox.addWidget(self.sb)
        hbox.addWidget(self.label3)
        

StyleSheet = '''
QPushButton {
    background-color: #ccc;     
}    
QPushButton:focus {
    background-color: #f55; 
} 
QLabel {
    background-color: #ccc;
    max-height: 24px;
    font-size: 15px;    
}    
QLabel:focus {
    color: #f55;
    background-color: transparent;
} 
QLineEdit, SpinBox {
    background-color: #ccc;
    font-size: 18px;    
}    
QLineEdit:focus, SpinBox:focus {
    background-color: transparent;
    color: #f55;
}
'''


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    w = InFocus()
    w.resize(700, 100)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

→ Ссылка