向 3rd 方库的现有方法添加功能
Add functionality to existing method of 3rd party library
如何向第 3 方对象的现有方法添加功能?
我不确定问题表达是否正确,所以这里有一个我想要实现的例子。
以下函数用于使按钮闪烁:
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 在被点击时都闪烁。
我的想法是将 clickColor 函数添加到 QPushButton 的 clicked.connect 方法中,但保持现有方法不变。
实现我想要实现的目标的正确方法是什么?
您可以创建一个自定义子类,然后在任何需要闪烁效果的地方使用它来代替普通的 QPushButton
。如果您使用的是 Qt Designer,您还可以使用 widget promotion to replace any buttons added to the ui file with your custom class (see 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_())
如何向第 3 方对象的现有方法添加功能?
我不确定问题表达是否正确,所以这里有一个我想要实现的例子。
以下函数用于使按钮闪烁:
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 在被点击时都闪烁。
我的想法是将 clickColor 函数添加到 QPushButton 的 clicked.connect 方法中,但保持现有方法不变。
实现我想要实现的目标的正确方法是什么?
您可以创建一个自定义子类,然后在任何需要闪烁效果的地方使用它来代替普通的 QPushButton
。如果您使用的是 Qt Designer,您还可以使用 widget promotion to replace any buttons added to the ui file with your custom class (see 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_())