【问题标题】:Qt Change stylesheet on focus in/out eventQt在焦点输入/输出事件上更改样式表
【发布时间】:2018-11-23 12:51:28
【问题描述】:

好吧,我现在感觉很愚蠢...我有一个 QTableWidget,当它有焦点时,我想更改样式表,使其成为边框“突出显示”。我可以简单地通过子类化小部件的 focusInEvent 来做到这一点,但是如果我调用 setStyleSheet() 它会覆盖我之前所做的所有样式。以清洁的名义,我试图找到仅更改边框颜色而不覆盖其他样式的最佳方法。

作为说明,我正在尝试为所有属性找到执行此操作的最佳方法。在这种情况下,我需要边框颜色,但我想我将来也想更改其他内容。

PyQt4 中的简单示例:

class MyTableWidget(QtGui.QTableWidget):
    def __init__(self):
        super(MyTableWidget, self).__init__()
        self.style = "QTableView {background: red; selection-background-color: green; border: 1px solid gray}" # beautiful, I know...
        self.setStyleSheet(self.style)

    def focusInEvent(self, event):
        super(MyTableWidget, self).focusInEvent(event)
        self.setStyleSheet("border-color: blue")

    def focusOutEvent(self, event):
        super(MyTableWidget, self).focusOutEvent(event)
        self.setStyleSheet(self.style)

【问题讨论】:

    标签: qt pyqt4 qstylesheet


    【解决方案1】:

    您可以为悬停和选择/取消选择状态指定不同的样式表部分:

        self.setStyleSheet(                                                                                           
            """                                                                                                            
            QTableView {                                                                                                   
                selection-background-color: green;                                                                         
                background: red;                                                                                           
                border: 1px solid gray;                                                                                    
            }                                                                                                              
            QTableView::item:hover:selected {                                                                              
                background: green;                                                                                         
                border: 1px solid blue;                                                                                    
            }                                                                                                              
            QTableView::item:hover:!selected {                                                                             
                background: red;                                                                                           
                border: 1px solid blue;                                                                                    
            }                                                                                                              
            """)
    

    有了这个样式表,您根本不需要实现focusInEventfocusOutEvent,Qt 的样式表引擎会为您处理事情。

    【讨论】:

    • 谢谢 Dmitry,我确实知道 QTableWidgetItems 的这一点,但是整个表格小部件呢?或任何其他小部件?
    • 好吧,hover 只要其他pseudo-states 也适用于小部件本身,因此您可以尝试在QTableView 的主要样式表之后添加QTableView:hover { border: 1px solid blue; } 之类的内容。但是,我刚刚尝试过,它似乎打破了selection-background-color... 不知道为什么,可能是 Qt4 样式表引擎中的一个错误。
    【解决方案2】:

    刚做了类似的事情,发现 QTableView::focus 试试看:)

    class MyTableWidget(QtWidgets.QTableWidget):
        def __init__(self):
            super(MyTableWidget, self).__init__()
            self.style = """
                QTableView {
                    background: red;
                    selection-background-color: green;
                    border: 1px solid gray;}
                QTableView::focus {border-color: blue;}"""
            self.setStyleSheet(self.style)
    

    谢谢, 标记

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多