带有输入键按下事件的组合框和单选按钮的焦点突出显示问题

Focus Highlighting issue with Combo box and Radio Button with Enter Key pressed event

我一直在研究 PyQt 每当按下 Enter 键而不是传统的 Tab 键时,不同小部件的焦点方法。

此外,我能够将焦点设置到我打算在 Enter 键事件上的小部件。但是,每当焦点位于 QComboBoxQRadioButton 上时,这两个小部件似乎不会像 QLineEditQPushButton 小部件那样突出显示。

我知道我必须将焦点策略设置为 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)