2

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を返しますが、スロバーが機能することもあれば、空白になることもあり、フレーム間に大きな醜い遅延が発生することもあります。特に、映画からのframeChangedシグナルを、同じ映画で単にjumpToFrameを呼び出す関数に接続するのは正しくないと思います。

さらに厄介なことに、ラムダを単にドロップすると(つまり、行を言うようにQtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame)、最初のフレームでさえレンダリングされません。

だから、私は何が間違っているのですか?

PS:.tabBar()は保護されたメンバーであることに気づきましたが、PyQtは保護されたメンバーの保護を解除すると(明らかに正しく)想定しました:)。私はQtを初めて使用するので、QTabWidgetをサブクラス化することはできません。

4

2 に答える 2

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)
于 2010-11-19T17:59:19.207 に答える
1

私は同じ問題に直面し、この投稿はそれを機能させるのに役立ちました: http://www.daniweb.com/forums/printthread.php?t=191210&pp=40

私にとっては、これが違いを生むようです: QMovie("image.gif", QByteArray(), self)

于 2010-11-18T20:19:03.787 に答える