我有一些代码使用python使用pyqt4创建qtabwidget。我想在标签中获得“悸动”动画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(即,使线条说世代odicetagcode)它也永远不会呈现第一帧。

所以,我做错了什么?

ps:我意识到.tabbar()是一个受保护的成员,但我假设(显然是正确)PyQt不保护受保护的成员:)。如果我可以帮助它,我是Qt的新手,我宁愿不是子类QtabWidget。

有帮助吗?

解决方案

我相信我最初发布的代码的问题是qmovie没有父级,因此accing问题允许销毁底层的c ++问题。我也有可能有线程问题 - 线程.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)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top