我有一些使用PyQt4从Python创建QTabWidget的代码。我想在选项卡中获得一个'throbber'动画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,但是throbber有时会工作,有时是空白的,有时候帧之间会有很大的丑陋延迟。特别是,我不禁想到将电影中的frameChanged信号连接到一个简单地在同一部电影上调用jumpToFrame的函数是不正确的。
更令人痛苦的是,如果我简单地删除lambda(也就是说,让行说出QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame
),它甚至不会渲染第一帧。
那么,我做错了什么?
PS:我意识到.tabBar()是一个受保护的成员,但我假设(显然是正确的)PyQt取消保护受保护的成员:)。我是Qt的新手,如果我能帮助它,我宁愿不要继承QTabWidget。
答案 0 :(得分:3)
我认为我最初发布的代码的问题是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)
答案 1 :(得分:1)
我遇到了同样的问题,这个帖子有助于它的工作: http://www.daniweb.com/forums/printthread.php?t=191210&pp=40
对我而言,这似乎有所不同:QMovie(“image.gif”,QByteArray(),self)