Как создать и анимировать собственное свойство виджета в PyQt4? - PullRequest
3 голосов
/ 19 ноября 2011

В следующем коде я могу анимировать стандартное свойство "geometry", но я получаю сообщение об ошибке, сообщающее, что свойство, которое я пытаюсь анимировать, не существует. Что я не так делаю?

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QObject, pyqtProperty

Это мой пользовательский виджет:

class FadingImage(QtGui.QWidget, QObject):
    def __init__(self, parent = None):
        super(QtGui.QWidget, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setMinimumSize(5,5)
        self.setOpacity(50)

    def paintEvent(self, ev):
        image = QtGui.QImage("/Users/thomas/pic1.jpg")
        qp = QtGui.QPainter()
        qp.begin(self)
        sourceRect = QtCore.QRect(0,0,image.width(),image.height())
        destRect = QtCore.QRect(0,0,self.width(),self.height())
        qp.drawImage(destRect, image, sourceRect)
        qp.setPen(QtGui.QColor(255, 255, 255))

Этот виджет рисует сплошной прямоугольник различной непрозрачности поверх изображения:

        qp.setBrush(QtGui.QColor(0,0,0,self.getOpacity()))
        qp.drawRect(0, 0, self.width(),self.height())
        qp.end()

    def getOpacity(self):
        return self._opacity

    def setOpacity(self, value):
        self._opacity = value

Здесь я определяю "непрозрачность" как свойство этого объекта:

        opacity = pyqtProperty( "int", self.getOpacity, self.setOpacity )


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(0,0,300,400)
        self.w = FadingImage(self)
        self.w.setGeometry(0,0,300,300)
        b = QtGui.QPushButton("fade",self)
        b.move(100,330)
        b.clicked.connect(self.animateOpacity)
        self.show()

Запуск этого метода работает должным образом:

    def animateGeometry(self):
        self.anim = QtCore.QPropertyAnimation(self.w, "geometry")
        self.anim.setDuration(300)
        self.anim.setStartValue(QtCore.QRect(0, 0, 300,300))
        self.anim.setEndValue(QtCore.QRect(150, 0, 300,300))
        self.anim.setEasingCurve(QtCore.QEasingCurve.InOutQuad)
        self.anim.start()

При запуске этого метода жалуется, что свойство opacity не существует:

    def animateOpacity(self):
        self.anim = QtCore.QPropertyAnimation(self.w, "opacity")
        self.anim.setDuration(300)
        self.anim.setStartValue(1)
        self.anim.setEndValue(255)
        self.anim.setEasingCurve(QtCore.QEasingCurve.InOutQuad)
        self.anim.start()

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

1 Ответ

2 голосов
/ 19 ноября 2011

Свойство opacity должно быть определено в области видимости класса:

class FadingImage(QtGui.QWidget):
    ...

    def getOpacity(self):
        return self._opacity

    def setOpacity(self, value):
        self._opacity = value

    opacity = pyqtProperty(int, getOpacity, setOpacity)
...