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())