使用PYQT4,为什么将TABWIDGET TABBAR图标窗口小部件设置为具有动画Qmovie的标签,有时会导致动画暂停? [带测试柜
题
我有一个带有qtabwidget的QMainWindow。从qtabwidget中,您可以根据qtabbar获得qtabbar和qtabbar的tabbutton。 https://doc.qt.io/archives/qt-4.8/qtabbar.html#settabbutton
因此,我想这样做,以在每个选项卡的文本旁边放置一个Throbber(动画gif)。这种“通常”工作正常,直到有时发生特殊的行为 - 即动画会冻结而不会更新。然后,移动鼠标可以让动画更新。显然,事件处理存在问题 - 如果QT有事件,那么动画效果很好,但是如果没有,则会停下来。
几天后,我终于设法为此问题减少了该问题,并在下面列出。
将下面的代码复制到文件中,创建下面的“图像”子文件夹,然后扔进throbber.gif(Say) http://upload.wikimedia.org/wikipedia/en/7/78/netscape_throbber_2.gif ).
运行程序,并注意将Throbber仅在将鼠标移到窗口上时如何动画。接下来,更改行 EVILNESS=10
至 EVILNESS=1
并重新运行该程序。现在请注意,即使不移动鼠标,Throbber如何连续动画。
为什么是这样?我可以解决吗?难道我做错了什么?
我的系统:
Windows XP SP3 Python 2.6.5(R265:79096,3月19日
感谢您的帮助 /建议。
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_()
解决方案
好吧,这显然是由PYQT 4.8.2固定的。猜猜我应该早些时候尝试升级...
更新:特别是:http:/bugreports.qt-project.org/browse/qtbug-12721
不隶属于 StackOverflow