2011-01-20 1 views
0

私はQTabWidgetを持つQMainWindowを持っています。 QTabWidgetからQTabBarを取得し、QTabBarのTabButtonをhttps://doc.qt.io/archives/qt-4.8/qtabbar.html#setTabButtonに設定します。PyQt4では、タブウィジェットのタブバーアイコンウィジェットをアニメーションQMovieのラベルに設定すると、アニメーションが一時停止することがあるのはなぜですか? [テストケースで]

これは、各タブのテキストの隣にスローバー(アニメーションgif)を配置するために行いたいと思います。この「通常」は、時には特異な動作が発生するまで、正常に機能しました。つまり、アニメーションがフリーズして更新されなくなるまでです。次に、マウスを動かすとアニメーションが更新されます。 Qtにイベントがあると、アニメーションはうまくいきましたが、そうでなければ、それは一時停止していました。

私はついにこの問題のテストケースを減らすことができました。これは数日の作業の後で、以下にリストされています。

下のコードをファイルにコピーし、その下に 'images'サブフォルダを作成し、throbber.gif(たとえばhttp://upload.wikimedia.org/wikipedia/en/7/78/Netscape_throbber_2.gif)を入れます。

プログラムを実行すると、マウスをウィンドウの上に移動すると、スロバがどのようにアニメーション化されるかがわかります。次に、EVILNESS=10行をEVILNESS=1に変更し、プログラムを再実行します。マウスを動かさなくても、スロバがどのように連続してアニメーション化されるかを確認してください。

これはなぜですか?私はそれを回避することはできますか?私は何か間違っているのですか?

私のシステム:

のWindows XP SP3 のPython 2.6.5(r265:79096、2010年3月19日、21時48分26秒)[MSC v.1500 32ビット(インテル)] PyQtは4.7.4

ご協力ありがとうございます。

import os, sys 
from PyQt4 import QtCore, QtGui 

GOODNESS = 10 
EVILNESS = 10 

class MyWindow(QtGui.QMainWindow): 
    def __init__(self, app): 
     QtGui.QMainWindow.__init__(self) 
     self.app = app 
     self.initUI() 
     for i in range(GOODNESS): 
      self.addTab() 
     for i in range(EVILNESS): 
      self.animateTabIndex(self.tabMain, i, True) 

    def initUI(self): 
     self.centralwidget=QtGui.QWidget(self) 
     self.tabMain = QtGui.QTabWidget(self.centralwidget) 
     self.tabOne = QtGui.QWidget() 
     self.tabOne.edit = QtGui.QLineEdit(self.tabOne) 
     self.tabOne.edit.setText(QtCore.PYQT_VERSION_STR) #Qt Version 
     self.tabOneLayout = QtGui.QVBoxLayout(self.tabOne) 
     self.tabOneLayout.addWidget(self.tabOne.edit) 
     self.tabMain.addTab(self.tabOne, "First Tab") 
     self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget) 
     self.verticalLayout.addWidget(self.tabMain) 
     self.setCentralWidget(self.centralwidget) 

    def addTab(self): 
     et = QtGui.QWidget() 
     someedit = QtGui.QLineEdit(et) 
     somelayout = QtGui.QVBoxLayout(et) 
     somelayout.addWidget(someedit) 
     self.tabMain.addTab(et, "Extra Tab") 

    def animateTabIndex(self, tabWidget, tabIndex, enable): 
     print tabIndex 
     tabBar = tabWidget.tabBar() 
     if enable: 
      lbl = QtGui.QLabel(tabWidget) 
      movie = QtGui.QMovie(os.path.join(self.app.basedir, "images\\throbber.gif"), parent=lbl) 
      movie.setCacheMode(QtGui.QMovie.CacheAll) 
      movie.setScaledSize(QtCore.QSize(16, 16)) 
      lbl.setMovie(movie) 
      movie.start() 
     else: 
      lbl = QtGui.QLabel(tabWidget) 
      lbl.setMinimumSize(QtCore.QSize(16, 16)) 
     tabBar.setTabButton(tabIndex, QtGui.QTabBar.LeftSide, lbl) 

class MyApp(QtGui.QApplication): 
    basedir = os.path.dirname(__file__) 
    def __init__(self, args): 
     super(MyApp, self).__init__(args) 
     self.mainWindow = MyWindow(self) 
    def exec_(self): 
     QtCore.pyqtRemoveInputHook() #Needed to allow pdb, etc to work 
     ret = super(MyApp, self).exec_() 
     return ret 

if __name__ == '__main__': 
    app = MyApp(sys.argv) 
    app.mainWindow.show() 
    app.exec_() 

答えて

0

これは明らかにPyQt 4.8.2で修正されました。以前のバージョンアップを試してみたはずです...

アップデート:特に:http:/bugreports.qt-project.org/browse/QTBUG-12721