使用PyQt4,为什么将qtabwidget标签栏图标小部件设置为带有动画电影的标签有时会导致动画暂停? [使用Testcase]

时间:2011-01-20 18:17:10

标签: qt4 pyqt pyqt4 qtabbar

我有一个带QTabWidget的QMainWindow。从QTabWidget,您可以获得QTabBar,并根据https://doc.qt.io/archives/qt-4.8/qtabbar.html#setTabButton设置QTabBar的TabButton

所以,我想这样做,在每个标签的文本旁边放一个throbber(动画gif)。这种“通常”工作得很好,直到有时出现一种特殊的行为 - 即动画会冻结而不会更新。然后,移动鼠标可以更新动画。很明显,事件处理存在问题 - 如果Qt有事件,那么动画工作正常,但如果没有,则暂停。

经过一天的工作后,我终于设法减少了这个问题的测试用例,并在下面列出。

将下面的代码复制到一个文件中,在其下面创建一个“images”子文件夹,并输入一个throbber.gif(比如http://upload.wikimedia.org/wikipedia/en/7/78/Netscape_throbber_2.gif)。

运行该程序,并注意当您将鼠标移到窗口上时,throbber是如何动画的。接下来,将行EVILNESS=10更改为EVILNESS=1并重新运行该程序。现在请注意,即使不移动鼠标,悸动者也会连续动画。

这是为什么?我可以解决吗?我做错了吗?

我的系统:

Windows XP SP3 Python 2.6.5(r265:79096,2010年3月19日,21:48:26)[MSC v.1500 32 bit(Intel)] PyQt 4.7.4

感谢您的帮助/建议。

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_()

1 个答案:

答案 0 :(得分:1)

嗯,这显然是由PyQt 4.8.2修复的。猜猜我应该早点尝试升级......

更新:特别是:http:/bugreports.qt-project.org/browse/QTBUG-12721