PyQt5 Stylesheet For QWidget's Child To Change QWidget

PyQt5 Stylesheet For QWidget's Child To Change QWidget

我有一个 QWidget,里面有一个 HBoxLayout。在这个 HBoxLayout 里面有几个按钮和一个 QLineEdit 对象。使用样式表,我想使 QLineEdit 聚焦时,QWidget 得到蓝色 outline/border.

我试过了:

QSearchWidgetStyleSheet = QWidget {background-color: rgb(27,27,27); border: none; margin: 0px; border-radius: 3px; padding: 0px;}
                          QLineEdit:focus {border: 3px solid rgb(100,100,100;}

我的 QLineEdit 样式表是:

QLineEditStyleSheet = QLineEdit {color: white; background-color: rgb(255,255,255,0); border: none; height: 32px; border-radius: 3px; margin-left: 3px; margin-right: 3px;}

但是,当 QLineEdit 被聚焦时,对 QWidget 没有影响。我应该更改什么才能使 QWidgetQLineEdit 聚焦时获得 border/outline?

QLineEdit:focus 将样式应用到 QLineEdit,而不是 QWidget。虽然子窗口小部件可以采用其父窗口小部件的样式 sheet,但我认为在一般样式 sheet 语法中它不会以相反的方式工作。相反,您可以描述仅考虑 QWidget 的场景...它在未聚焦时应该有边框,而在聚焦时不应该有边框。

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

class Widget(QWidget):

    def __init__(self):
        super().__init__()
        hbox = QHBoxLayout(self)
        hbox.addWidget(QPushButton('Push'))
        hbox.addWidget(QLineEdit())
        self.setAttribute(Qt.WA_StyledBackground, True)
        self.setStyleSheet('''
        Widget {
            border: 3px solid blue;
        }
        Widget:focus {
            border: none;
        }''')

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.setFocus()


class Template(QWidget):

    def __init__(self):
        super().__init__()
        grid = QGridLayout(self)
        grid.addWidget(Widget(), 0, 0)
        self.resize(300, 300)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = Template()
    gui.show()
    sys.exit(app.exec_())

当然,如果您愿意使用其他方法,例如信号和槽,您可以更精确地实现该功能。