Используя PyQt и Qt4, это правильный способ получить троббер во вкладке QTabWidget?

У меня есть некоторый код создания QTabWidget из Python с использованием PyQt4. Я хочу получить анимированный GIF-ролик на вкладке. Единственный способ, который я нашел, заключается в следующем запутанном методе.

tabBar = self.tabReports.tabBar()
lbl = QtGui.QLabel(self.tabReports)
movie = QtGui.QMovie(os.path.join(self.basedir, "images\\throbber.gif"))
lbl.setMovie(movie)
QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), lambda i: movie.jumpToFrame(i))
movie.start()
log.debug("valid = %s"%(movie.isValid()))
tabBar.setTabButton(idxtab, QtGui.QTabBar.LeftSide, lbl)

Вызов отладки всегда возвращает true, но пульсатор иногда работает, иногда пустой, а иногда имеет большую ужасную задержку между кадрами. В частности, я не могу не думать, что подключение сигнала frameChanged из фильма к функции, которая просто вызывает jumpToFrame в том же фильме, является неправильным.

Еще больше огорчает, если я просто уроню лямбду QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame) он никогда не рендерит даже первый кадр.

Итак, что я делаю не так?

PS: я понимаю, что.tabBar() является защищенным членом, но я предположил (очевидно, правильно), что PyQt снимает защиту с защищенных членов:). Я новичок в Qt, и я бы предпочел не создавать подкласс QTabWidget, если смогу помочь.

2 ответа

Решение

Я полагаю, что проблема с кодом, который я первоначально разместил, состояла в том, что у QMovie не было родителя, и, таким образом, проблемы с областями видимости позволили уничтожить основную проблему C++. Также возможно, что у меня были проблемы с потоками - threading.thread и QThread не очень хорошо играют вместе. Рабочий код, который у меня сейчас есть, ниже - не нужно вмешиваться ни в сигналы, ни в слоты.

def animateTab(self, tab_widget, enable):
    tw = tab_widget
    tabBar = tw.tabBar()
    if enable:
        lbl = QtGui.QLabel(tw)
        movie = QtGui.QMovie("images\\throbber.gif"), parent=lbl)
        movie.setScaledSize(QtCore.QSize(16, 16))
        lbl.setMovie(movie)
        movie.start()
    else:
        lbl = QtGui.QLabel(tw)
        lbl.setMinimumSize(QtCore.QSize(16, 16))
    tabBar.setTabButton(tab_section.index, QtGui.QTabBar.LeftSide, lbl)

Я столкнулся с той же проблемой, и эта публикация помогла заставить его работать: http://www.daniweb.com/forums/printthread.php?t=191210&pp=40

Для меня это, кажется, имеет значение: QMovie("image.gif", QByteArray(), self)

Другие вопросы по тегам