带有输入键按下事件的组合框和单选按钮的焦点突出显示问题
Focus Highlighting issue with Combo box and Radio Button with Enter Key pressed event
我一直在研究 PyQt
每当按下 Enter 键而不是传统的 Tab 键时,不同小部件的焦点方法。
此外,我能够将焦点设置到我打算在 Enter 键事件上的小部件。但是,每当焦点位于 QComboBox
或 QRadioButton
上时,这两个小部件似乎不会像 QLineEdit
或 QPushButton
小部件那样突出显示。
我知道我必须将焦点策略设置为 StrongFocus
,我已经尝试过该方法和其他几种方法,但无法解决此问题。
此外,此行为运行良好,组合框或单选按钮似乎也可以使用 Tab 键突出显示。
请在下面找到我到目前为止尝试过的代码以及实际结果的快照。
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Combo_and_Radio_Focus(QDialog):
def __init__(self):
super().__init__()
# setting title
self.setWindowTitle("Combo Box Focus Test")
# setting geometry
self.setGeometry(600, 200, 650, 400)
# Some widgets for testing
self.le1 = QLineEdit(self)
self.le1.setFixedSize(100, 25)
self.le2 = QLineEdit(self)
self.le2.setFixedSize(100, 25)
self.cbo1 = QComboBox(self)
self.cbo1.setFixedSize(100, 25)
self.cbo1.setStyleSheet('QComboBox {background-color: white;}')
self.cbo1.setFocusPolicy(Qt.StrongFocus)
self.cbo1.addItems(["", "Item1", "Item2", "Item3"])
self.cbo2 = QComboBox(self)
self.cbo2.setFixedSize(100, 25)
self.cbo2.setStyleSheet('QComboBox {background-color: white;}')
self.cbo2.setFocusPolicy(Qt.StrongFocus)
self.cbo2.addItems(["", "Item1", "Item2", "Item3"])
self.RB1 = QRadioButton("1")
self.RB1.setChecked(True)
self.RB1.setFixedSize(100, 20)
self.RB1.setFocusPolicy(Qt.StrongFocus)
self.RB2 = QRadioButton("2")
self.RB2.setFixedSize(100, 20)
self.RB2.setFocusPolicy(Qt.StrongFocus)
self.vbl = QVBoxLayout()
self.vbl.addWidget(self.le1)
self.vbl.addWidget(self.le2)
self.vbl.addWidget(self.cbo1)
self.vbl.addWidget(self.cbo2)
self.vbl.addWidget(self.RB1)
self.vbl.addWidget(self.RB2)
self.setLayout(self.vbl)
# showing all the widgets
self.show()
def keyPressEvent(self, qKeyEvent):
if int(qKeyEvent.modifiers()) == QtCore.Qt.AltModifier:
qKeyEvent.ignore()
return
if qKeyEvent.key() == QtCore.Qt.Key_Return or qKeyEvent.key() == QtCore.Qt.Key_Enter:
QWidget.focusNextChild(self)
else:
super().keyPressEvent(qKeyEvent)
App = QApplication(sys.argv)
App.setStyle(QStyleFactory.create('Fusion'))
# create the instance of our Window
combo_and_Radio_Focus = Combo_and_Radio_Focus()
# start the app
sys.exit(App.exec())
LineEdit1_Highlighted以下
ComboBox1_Dont_Highlight以下
当按下 Tab 使焦点发生变化时,应用程序会在 window 中设置 Qt.WA_KeyboardFocusChange
属性,该属性由 QStyle 使用制作边框绘画,但由于情况并非如此,因此必须直接设置该属性:
def keyPressEvent(self, qKeyEvent):
if qKeyEvent.modifiers() & QtCore.Qt.AltModifier:
qKeyEvent.ignore()
elif qKeyEvent.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
self.focusNextChild()
<b>self.window().setAttribute(Qt.WA_KeyboardFocusChange)</b>
else:
super().keyPressEvent(qKeyEvent)
我一直在研究 PyQt
每当按下 Enter 键而不是传统的 Tab 键时,不同小部件的焦点方法。
此外,我能够将焦点设置到我打算在 Enter 键事件上的小部件。但是,每当焦点位于 QComboBox
或 QRadioButton
上时,这两个小部件似乎不会像 QLineEdit
或 QPushButton
小部件那样突出显示。
我知道我必须将焦点策略设置为 StrongFocus
,我已经尝试过该方法和其他几种方法,但无法解决此问题。
此外,此行为运行良好,组合框或单选按钮似乎也可以使用 Tab 键突出显示。
请在下面找到我到目前为止尝试过的代码以及实际结果的快照。
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Combo_and_Radio_Focus(QDialog):
def __init__(self):
super().__init__()
# setting title
self.setWindowTitle("Combo Box Focus Test")
# setting geometry
self.setGeometry(600, 200, 650, 400)
# Some widgets for testing
self.le1 = QLineEdit(self)
self.le1.setFixedSize(100, 25)
self.le2 = QLineEdit(self)
self.le2.setFixedSize(100, 25)
self.cbo1 = QComboBox(self)
self.cbo1.setFixedSize(100, 25)
self.cbo1.setStyleSheet('QComboBox {background-color: white;}')
self.cbo1.setFocusPolicy(Qt.StrongFocus)
self.cbo1.addItems(["", "Item1", "Item2", "Item3"])
self.cbo2 = QComboBox(self)
self.cbo2.setFixedSize(100, 25)
self.cbo2.setStyleSheet('QComboBox {background-color: white;}')
self.cbo2.setFocusPolicy(Qt.StrongFocus)
self.cbo2.addItems(["", "Item1", "Item2", "Item3"])
self.RB1 = QRadioButton("1")
self.RB1.setChecked(True)
self.RB1.setFixedSize(100, 20)
self.RB1.setFocusPolicy(Qt.StrongFocus)
self.RB2 = QRadioButton("2")
self.RB2.setFixedSize(100, 20)
self.RB2.setFocusPolicy(Qt.StrongFocus)
self.vbl = QVBoxLayout()
self.vbl.addWidget(self.le1)
self.vbl.addWidget(self.le2)
self.vbl.addWidget(self.cbo1)
self.vbl.addWidget(self.cbo2)
self.vbl.addWidget(self.RB1)
self.vbl.addWidget(self.RB2)
self.setLayout(self.vbl)
# showing all the widgets
self.show()
def keyPressEvent(self, qKeyEvent):
if int(qKeyEvent.modifiers()) == QtCore.Qt.AltModifier:
qKeyEvent.ignore()
return
if qKeyEvent.key() == QtCore.Qt.Key_Return or qKeyEvent.key() == QtCore.Qt.Key_Enter:
QWidget.focusNextChild(self)
else:
super().keyPressEvent(qKeyEvent)
App = QApplication(sys.argv)
App.setStyle(QStyleFactory.create('Fusion'))
# create the instance of our Window
combo_and_Radio_Focus = Combo_and_Radio_Focus()
# start the app
sys.exit(App.exec())
LineEdit1_Highlighted以下
ComboBox1_Dont_Highlight以下
当按下 Tab 使焦点发生变化时,应用程序会在 window 中设置 Qt.WA_KeyboardFocusChange
属性,该属性由 QStyle 使用制作边框绘画,但由于情况并非如此,因此必须直接设置该属性:
def keyPressEvent(self, qKeyEvent):
if qKeyEvent.modifiers() & QtCore.Qt.AltModifier:
qKeyEvent.ignore()
elif qKeyEvent.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
self.focusNextChild()
<b>self.window().setAttribute(Qt.WA_KeyboardFocusChange)</b>
else:
super().keyPressEvent(qKeyEvent)