Usando PyQt e Qt4, esta é a maneira correta de obter uma vibração em uma guia QTabWidget?

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

  •  26-09-2020
  •  | 
  •  

Pergunta

Eu tenho algum código criando um QTabWidget de Python usando PyQt4.Quero obter um gif animado 'throbber' na guia.A /única maneira/que descobri de fazer isso é o seguinte método complicado.

tabBar = self.tabReports.tabBar()
lbl = QtGui.QLabel(self.tabReports)
movie = QtGui.QMovie(os.path.join(self.basedir, "images\\throbber.gif"))
lbl.setMovie(movie)
QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), lambda i: movie.jumpToFrame(i))
movie.start()
log.debug("valid = %s"%(movie.isValid()))
tabBar.setTabButton(idxtab, QtGui.QTabBar.LeftSide, lbl)

A chamada de depuração sempre retorna verdadeiro, mas o pulsador às vezes funciona, às vezes está em branco e às vezes tem um atraso grande e feio entre os quadros.Em particular, não posso deixar de pensar que conectar o sinal frameChanged do filme a uma função que simplesmente chama jumpToFrame no mesmo filme não está correto.

Ainda mais angustiante, se eu simplesmente abandonar o lambda (ou seja, faça a linha dizer QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame) ele nunca renderiza nem mesmo o primeiro quadro.

Então, o que estou fazendo de errado?

PS:Sei que .tabBar() é um membro protegido, mas presumi (aparentemente corretamente) que PyQt desprotege membros protegidos :).Sou novo no Qt e prefiro não subclassificar QTabWidget se puder evitar.

Foi útil?

Solução

Acredito que o problema com o código que postei inicialmente foi que o QMovie não tinha um pai e, portanto, os problemas de escopo permitiram que o problema subjacente do C++ fosse destruído.Também é possível que eu tenha tido problemas de threading - threading.thread e QThread não funcionam bem juntos.O código de trabalho que tenho agora está abaixo - não é necessário mexer com sinais nem slots.

def animateTab(self, tab_widget, enable):
    tw = tab_widget
    tabBar = tw.tabBar()
    if enable:
        lbl = QtGui.QLabel(tw)
        movie = QtGui.QMovie("images\\throbber.gif"), parent=lbl)
        movie.setScaledSize(QtCore.QSize(16, 16))
        lbl.setMovie(movie)
        movie.start()
    else:
        lbl = QtGui.QLabel(tw)
        lbl.setMinimumSize(QtCore.QSize(16, 16))
    tabBar.setTabButton(tab_section.index, QtGui.QTabBar.LeftSide, lbl)

Outras dicas

Eu enfrentei o mesmo problema e esta postagem ajudou a fazer funcionar:http://www.daniweb.com/forums/printthread.php?t=191210&pp=40

Para mim isso parece fazer a diferença:QMovie("imagem.gif", QByteArray(), self)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top