Con PyQt4, ¿por qué no establecer un TabWidget barra de pestañas icono del widget a una etiqueta con un QMovie animada veces causa la animación para hacer una pausa? [Con caso_prueba]

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

  •  13-10-2019
  •  | 
  •  

Pregunta

Tengo un QMainWindow con un QTabWidget. Desde el QTabWidget, se puede obtener una QTabBar y el conjunto de la QTabBar TabButton según https://doc.qt.io/archives/qt-4.8/qtabbar.html#setTabButton

Por lo tanto, me gustaría hacer esto para poner un Throbber (GIF animado) junto al texto para cada ficha. Esta bien "por lo general" trabajado, hasta a veces un comportamiento peculiar ocurrió - a saber, la animación se congelaría y no actualización. A continuación, moviendo el ratón permite la actualización de la animación. Es evidente que no había problema como el ingenio de procesamiento de eventos - si Qt tiene un evento a continuación, la animación trabajado bien, pero si no, se detuvo

.

Por fin he logrado conseguir un caso de prueba reducida para este problema después de un día de trabajo, y se enumeran a continuación.

Copia el siguiente código en un archivo, crear una subcarpeta 'imágenes' por debajo de ella, y tirar en un throbber.gif (por ejemplo http://upload.wikimedia.org/wikipedia/en/7/78/Netscape_throbber_2.gif ).

Ejecutar el programa, y ??el aviso cómo el Throbber sólo se mueve cuando se mueve el puntero del ratón sobre la ventana. A continuación, cambie la línea de EVILNESS=10 a EVILNESS=1 y vuelva a ejecutar el programa. Fíjense ahora cómo el Throbber anima continuamente, incluso sin mover el puntero del ratón.

¿Por qué es esto? puedo trabajar alrededor de ella? ¿Estoy haciendo algo mal?

Mi sistema:

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

Gracias por la ayuda / sugerencias.

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_()
¿Fue útil?

Solución

Bueno, esto fue aparentemente fijado por PyQt 4.8.2. modernización Supongo que debería haber intentado antes ...

UPDATE: Específicamente esto: http: /bugreports.qt-project.org/browse/QTBUG-12721

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top