Avec PyQt4, pourquoi la fixation d'un tabwidget icône widget à TabBar une étiquette avec une QMovie animée parfois la cause de l'animation pour faire une pause? [Avec Testcase]

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

  •  13-10-2019
  •  | 
  •  

Question

J'ai un QMainWindow avec un QTabWidget. De l'QTabWidget, vous pouvez obtenir un QTabBar et l'ensemble TabButton du QTabBar selon https://doc.qt.io/archives/qt-4.8/qtabbar.html#setTabButton

Alors, je voudrais faire pour mettre un throbber (GIF animé) à côté du texte pour chaque onglet. Cette « habituellement » a bien fonctionné, jusqu'à ce que parfois un comportement particulier survenu - à savoir l'animation gèlerait et non mise à jour. Ensuite, déplaçant votre souris permet la mise à jour de l'animation. De toute évidence, il était question que l'esprit le traitement des événements - si Qt est un événement alors l'animation a bien fonctionné, mais sinon, il mis en pause

.

J'ai enfin réussi à obtenir un testcase réduit pour ce problème après une journée de travail, et il est indiqué ci-dessous.

Copiez le dessous code dans un fichier, créer un sous-dossier 'images' en dessous, et jeter dans un throbber.gif (par exemple http://upload.wikimedia.org/wikipedia/en/7/78/Netscape_throbber_2.gif ).

Exécutez le programme, et remarquez comment l'throbber anime uniquement lorsque vous déplacez votre souris sur la fenêtre. Ensuite, modifiez la ligne EVILNESS=10 à EVILNESS=1 et exécutez à nouveau le programme. Remarquez maintenant comment l'throbber anime en permanence, même sans bouger votre souris.

Pourquoi est-ce? puis-je travailler autour d'elle? Ai-je fait quelque chose de mal?

Mon système:

Windows XP SP3 Python 2.6.5 (R265: 79096 19 Mar 2010, 21:48:26) [MSC v.1500 32 bits (Intel)] PyQt 4.7.4

Merci pour l'aide / suggestions.

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_()
Était-ce utile?

La solution

Eh bien, cela a été apparemment fixé par PyQt 4.8.2. Je suppose que je devrais avoir essayé la mise à niveau plus tôt ...

MISE À JOUR: Plus précisément ceci: http: /bugreports.qt-project.org/browse/QTBUG-12721

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top