Qt QStyleSheet中的动画Gif静态
我想用样式表定制QProgressBar的外观。我想给它一个生动的“不确定”的外观。因此,我制作了一个动画GIF,粘贴在Qt QStyleSheet中的动画Gif静态,qt,stylesheet,gif,animated,qtstylesheets,Qt,Stylesheet,Gif,Animated,Qtstylesheets,我想用样式表定制QProgressBar的外观。我想给它一个生动的“不确定”的外观。因此,我制作了一个动画GIF,粘贴在QProgressBar::chunk的背景中 它显示得很好,但图像是静态的,没有动画。有什么建议或解决办法吗 我正在OS X 10.8上运行PyQt 4.9.4。因此,这是您面临的稍微复杂一些的问题 QProgressBar依赖于来自循环或某个确定数量的信息来表示完成百分比。当您通过代码设置值时,Qt将设置进度条的值,重新绘制进度条,从而显示更新后的值。这实际上需要在循环中进
QProgressBar::chunk
的背景中
它显示得很好,但图像是静态的,没有动画。有什么建议或解决办法吗
我正在OS X 10.8上运行PyQt 4.9.4。因此,这是您面临的稍微复杂一些的问题 QProgressBar依赖于来自循环或某个确定数量的信息来表示完成百分比。当您通过代码设置值时,Qt将设置进度条的值,重新绘制进度条,从而显示更新后的值。这实际上需要在循环中进行几毫秒的处理。如果您不这样做,那么Qt的优化将永远不会重新绘制。这是同步的 在web上使用您想要的“不确定”外观(如AJAX gif微调器或条形图),因为该进程实际上已从客户端移开,正在服务器上处理,并且正在等待响应。客户端的进程根本没有被阻止,因此可以自由地用电影更新界面 通过在QLabel中使用QMovie,您可以获得想要的外观:
movie = QMovie()
movie.setFileName('/path/to/ajax_loader.gif')
movie.start()
label = QLabel(parent)
label.setMovie(movie)
这将使您的微调器不确定。但是,它只会在事件循环处理事件时播放。一旦启动实际的辅助进程,它将阻止事件循环,以便开始播放电影
您需要将事件“泵送”到循环中的播放器,以使其更新。您可以通过以下方式完成此操作:
app = QApplication.instance()
# show my label
label.show()
for obj in objs:
# process stuff on my obj
app.processEvents()
# hide the label
label.hide()
当然,根据您在循环中执行的每个动作所需的时间,微调器/加载器电影将“卡住”,直到事件再次处理
实际上,实现您想要的外观的最佳方法是使用线程应用程序。您可以使用QThread执行所有操作,并在处理加载程序时向用户显示加载程序映像。这与ajax的工作方式更为相似——当工作线程处理所有事情时,主Qt事件循环将在未知的时间内继续运行。这是异步的
比如:
class MyThread(QThread):
def run( self ):
# perform some actions
...
class MyDialog(QDialog):
def __init__( self, parent ):
# initialize the dialog
...
self._thread = MyThread(self)
self._thread.finished.connect(self.refreshResults)
self.refresh()
def refresh( self ):
# show the ajax spinner
self._ajaxLabel.show()
# start the thread and wait for the results
self._thread.start()
def refreshResults( self ):
# hide the ajax spinner
self._ajaxLabel.hide()
# process the thread results
...
我有一个加载程序小部件,每当我在GUI库中做类似的事情时都会使用它。如果您想查看/使用它的代码,它的at和类是XLoaderWidget(projexui.widgets.XLoaderWidget)
设置与上面相同,但只是:
from projexui.widgets.xloaderwidget import XLoaderWidget
class MyThread(QThread):
def run( self ):
# perform some actions
...
class MyDialog(QDialog):
def __init__( self, parent ):
# initialize the dialog
...
self._thread = MyThread(self)
self._thread.finished.connect(self.refreshResults)
self.refresh()
def refresh( self ):
# show the ajax spinner
XLoaderWidget.start(self)
# start the thread and wait for the results
self._thread.start()
def refreshResults( self ):
# hide the ajax spinner
XLoaderWidget.stop(self)
# process the thread results
...
多好的回答啊,埃里克!谢谢你讲了这么多细节。我将把这标记为正确答案,因为我认为它将帮助大多数人。在我的实际情况下,我已经有一个异步进程在更新我的进度条。我想应用动画GIF作为进度条完成部分的背景,这样可以给人持续工作的视觉印象。然而,也许一个小的,循环QMovie到酒吧的一边也同样有效。非常感谢。哦,我明白了…我误解了这个问题…在这种情况下,我真的不知道答案,除非你定制了一个循环QMovie和一个标签,你根据完成的百分比影响了宽度。这将是一个有用的小部件。