TypeError:PyQt4.QtCore.QVariantAnimation表示一个C ++抽象类,无法实例化

时间:2019-06-13 03:28:13

标签: python pyqt pyqt5 pyqt4 qvariantanimation

我有这个PyQt5片段,我正尝试将其转换为PyQt4。 PyQt5版本效果很好,但是当我尝试转换为PyQt4时,出现此错误。我删除了QtWidgets,但仍然收到此错误。我还尝试仅实例化self.animation = QtCore.QVariantAnimation(),但仍然遇到相同的错误。

Traceback (most recent call last):
  File ".\test1.py", line 29, in <module>
    lineedit = LineEdit()
  File ".\test1.py", line 13, in __init__
    valueChanged=self.on_color_change,
TypeError: PyQt4.QtCore.QVariantAnimation represents a C++ abstract class and cannot be instantiated

有效的PyQt5版本

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class LineEdit(QtWidgets.QLineEdit):
    def __init__(self):
        super(LineEdit, self).__init__()
        self.textChanged.connect(self.start_animation)

        self.animation = QtCore.QVariantAnimation(
            startValue=QtGui.QColor(255, 127, 127),
            endValue=QtGui.QColor(255, 255, 255),
            duration=1000,
            valueChanged=self.on_color_change,
        )

    @QtCore.pyqtSlot()
    def start_animation(self):
        if self.animation.state() == QtCore.QAbstractAnimation.Running:
            self.animation.stop()
        self.animation.start()

    @QtCore.pyqtSlot(QtCore.QVariant)
    @QtCore.pyqtSlot(QtGui.QColor)
    def on_color_change(self, color):
        self.setStyleSheet("QLineEdit{background-color: %s}" % (color.name(),))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    lineedit = LineEdit()
    lineedit.show()
    sys.exit(app.exec_())

PyQt4版本损坏

import sys
from PyQt4 import QtCore, QtGui

class LineEdit(QtGui.QLineEdit):
    def __init__(self):
        super(LineEdit, self).__init__()
        self.textChanged.connect(self.start_animation)

        self.animation = QtCore.QVariantAnimation(
            startValue=QtGui.QColor(255, 127, 127),
            endValue=QtGui.QColor(255, 255, 255),
            duration=1000,
            valueChanged=self.on_color_change,
        )

    @QtCore.pyqtSlot()
    def start_animation(self):
        if self.animation.state() == QtCore.QAbstractAnimation.Running:
            self.animation.stop()
        self.animation.start()

    @QtCore.pyqtSlot(QtCore.QVariant)
    @QtCore.pyqtSlot(QtGui.QColor)
    def on_color_change(self, color):
        self.setStyleSheet("QLineEdit{background-color: %s}" % (color.name(),))

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    lineedit = LineEdit()
    lineedit.show()
    sys.exit(app.exec_())

有人知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:0)

在Qt4中,updateCurrentValue()是一个纯虚拟方法,需要实现,在Qt5的情况下,它变成了仅一个虚拟方法,在第一种情况下,C ++强制实现了它,但随着Qt5的改变,不再需要,因此解决方案是实现该方法:

# ...
class VariantAnimation(QtCore.QVariantAnimation):
    def updateCurrentValue(self, value):
        pass


class LineEdit(QtGui.QLineEdit):
    def __init__(self):
        super(LineEdit, self).__init__()
        self.textChanged.connect(self.start_animation)

        self.animation = VariantAnimation(
            startValue=QtGui.QColor(255, 127, 127),
            endValue=QtGui.QColor(255, 255, 255),
            duration=1000,
            valueChanged=self.on_color_change,
        )

    # ...

    @QtCore.pyqtSlot(QtCore.QVariant)
    @QtCore.pyqtSlot(QtGui.QColor)
    def on_color_change(self, color):
        if isinstance(color, QtCore.QVariant):
            color = QtGui.QColor(color)
        self.setStyleSheet("QLineEdit{background-color: %s}" % (color.name(),))
    # ...