Warum bewirkt die Einstellung eines TabBar -Widgets von TabBar -Symbolen auf ein Etikett mit einem animierten QMovie manchmal dazu, dass die Animation innehalt? [Mit TestCase
Frage
Ich habe eine QMainWindow mit einem Qtabwidget. Aus dem QTabwidget können Sie eine QTABBAR und die Tabbutton des QTabbar wie per festlegen https://doc.qt.io/archives/qt-4.8/qtabbar.html#settabbutton
Ich möchte dies also tun, um einen Pouln (animierte GIF) neben den Text für jede Registerkarte zu setzen. Diese "normalerweise" funktionierte gut, bis manchmal ein besonderes Verhalten auftrat - nämlich die Animation frierte ein und nicht aktualisiert. Wenn Sie dann Ihre Maus bewegen, können Sie die Animation aktualisieren. Offensichtlich gab es als Ausgabe mit der Ereignisverarbeitung - wenn QT ein Ereignis hat, dann hat die Animation gut funktioniert, aber wenn nicht, hielt sie inne.
Ich habe es endlich geschafft, nach einer Arbeitstage ein reduziertes Testgeschäft für dieses Problem zu erhalten, und es ist unten aufgeführt.
Kopieren Sie den folgenden Code in eine Datei, erstellen Sie einen Unterordner "Bilder" darunter und werfen http://upload.wikimedia.org/wikipedia/en/7/78/netcape_throbber_2.gif ).
Führen Sie das Programm aus und bemerken Sie, wie der Schläfen nur animiert, wenn Sie Ihre Maus über das Fenster bewegen. Als nächstes ändern Sie die Linie EVILNESS=10
zu EVILNESS=1
und das Programm erneut übertragen. Beachten Sie nun, wie der Schläfen kontinuierlich animiert, auch ohne Ihre Maus zu bewegen.
Warum ist das? Kann ich es herumarbeiten? Mache ich etwas falsch?
Mein System:
Windows XP SP3 Python 2.6.5 (R265: 79096, 19. März 2010, 21:48:26) [MSC V.1500 32 Bit (Intel)] PYQT 4.7.4
Vielen Dank für die Hilfe / Vorschläge.
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_()
Lösung
Nun, dies wurde anscheinend von PYQT 4.8.2 behoben. Ich schätze, ich hätte versuchen sollen, früher zu aktualisieren ...
UPDATE: Speziell dies: http :/bugraports.qtproject.org/browse/qtbug-12721