Используя PyQt и Qt4, является ли это правильным способом получить пульсирующую кнопку на вкладке QTabWidget?
Вопрос
У меня есть код, создающий QTabWidget из Python с использованием PyQt4.Я хочу разместить на вкладке анимированный GIF-изображение «throbber»./Единственный способ/, который я нашел, как это сделать, - это следующий запутанный метод.
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
) он никогда не отображает даже первый кадр.
Итак, что я делаю не так?
ПС:Я понимаю, что .tabBar() является защищенным членом, но я предположил (по-видимому, правильно), что PyQt снимает защиту защищенных членов :).Я новичок в Qt, и я бы предпочел не создавать подкласс QTabWidget, если смогу.
Решение
Я считаю, что проблема с кодом, который я изначально опубликовал, заключалась в том, что у 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)