【问题标题】:Using PyQt and Qt4, is this the proper way to get a throbber in a QTabWidget tab?使用 PyQt 和 Qt4,这是在 QTabWidget 选项卡中获取 throbber 的正确方法吗?
【发布时间】:2010-07-21 17:03:56
【问题描述】:

我有一些代码使用 PyQt4 从 Python 创建 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(也就是说,将行设为 QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame),它甚至不会渲染第一帧。

那么,我做错了什么?

PS:我意识到 .tabBar() 是受保护的成员,但我假设(显然是正确的)PyQt 取消保护受保护的成员:)。我是 Qt 的新手,如果我能帮上忙,我宁愿不要继承 QTabWidget。

【问题讨论】:

    标签: qt qt4 pyqt pyqt4 qtabbar


    【解决方案1】:

    我认为我最初发布的代码的问题是 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)
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,这篇文章有助于使它发挥作用: http://www.daniweb.com/forums/printthread.php?t=191210&pp=40

      对我来说,这似乎有所不同:QMovie("image.gif", QByteArray(), self)

      【讨论】:

      • 确实,在您的情况下,这也是一个父问题。 self 参数是 C++ 小部件的“父级” - 没有它,c++ 对象将在您的方法返回后消失。有了它,它只会在 c++ 对象'self'附加到死时才会死。我发现在使用 PyQt 的大部分时间里,最好假装你在 C++ 中工作,而只使用 python 来获得更好的语法:)
      猜你喜欢
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 2014-08-27
      • 2013-04-25
      相关资源
      最近更新 更多