私は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_()