【问题标题】:Add functionality to existing method of 3rd party library向 3rd 方库的现有方法添加功能
【发布时间】:2017-05-27 06:13:21
【问题描述】:

如何向 3rd 方对象的现有方法添加功能?

我不确定问题是否正确表达,所以这里有一个我想要实现的示例。

以下函数用于闪烁按钮:

def clickColor(button, color):
    beforeColor = button.palette().color(QPalette.Background)
    button.setStyleSheet("background-color: %s" % color)
    QTimer.singleShot(100, lambda: unClickColor(button, beforeColor))

def unClickColor(button, beforeColor):
    button.setStyleSheet("background-color: %s" % beforeColor.name())

我希望 PyQt5 库的每个 QPushButton 在单击时闪烁。

我的想法是在 QPushButton 的 clicked.connect 方法中添加 clickColor 函数,但保持现有方法不变。

什么是做我想要实现的目标的正确方法?

【问题讨论】:

    标签: python pyqt pyqt5 overriding qpushbutton


    【解决方案1】:

    您可以创建一个自定义子类,然后在需要闪烁效果的任何地方使用它而不是普通的QPushButton。如果您使用的是 Qt Designer,您还可以使用 widget promotion 将添加到 ui 文件中的任何按钮替换为您的自定义类(有关详细信息,请参阅 this answer)。

    这是一个基本的演示脚本:

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class BlinkButton(QtWidgets.QPushButton):
        def __init__(self, *args, **kwargs):
            super(BlinkButton, self).__init__(*args, **kwargs)
            self.clicked.connect(self._blink)
            self._blink_color = QtGui.QColor()
    
        def blinkColor(self):
            return QtGui.QColor(self._blink_color)
    
        def setBlinkColor(self, color=None):
            self._blink_color = QtGui.QColor(color)
    
        def _blink(self):
            if self._blink_color.isValid():
                self.setStyleSheet(
                    'background-color: %s' % self._blink_color.name())
                QtCore.QTimer.singleShot(100, lambda: self.setStyleSheet(''))
    
    class Window(QtWidgets.QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.button = BlinkButton('Test', self)
            self.button.setBlinkColor('red')
            self.button.clicked.connect(self.handleButton)
            layout = QtWidgets.QVBoxLayout(self)
            layout.addWidget(self.button)
            layout.addWidget(self.button2)
    
        def handleButton(self):
            print('Hello World!')
    
    if __name__ == '__main__':
    
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.setGeometry(600, 100, 200, 100)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      相关资源
      最近更新 更多