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

StackOverflow https://stackoverflow.com/questions/4750884

  •  13-10-2019
  •  | 
  •  

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_()
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top