我想用自定义样式表一QProgressBar的外观。 我想给它的动画,“不确定”的样子。 所以我做了一个GIF动画中的背景坚持QProgressBar::chunk
。
它精细显示出来,但图像是静态的,没有动画。 任何建议或解决方法?
我在OS X 10.8上运行的PyQt 4.9.4。
我想用自定义样式表一QProgressBar的外观。 我想给它的动画,“不确定”的样子。 所以我做了一个GIF动画中的背景坚持QProgressBar::chunk
。
它精细显示出来,但图像是静态的,没有动画。 任何建议或解决方法?
我在OS X 10.8上运行的PyQt 4.9.4。
所以,这是你面对一个稍微复杂的问题。
在QProgressBar依赖于从一个循环或一些确定的量来表示完成的百分比的信息。 当你通过代码设置的值,QT将设置进度条的价值,重新绘制,从而显示更新的值。 这实际上需要你的循环中处理的几毫秒。 如果你不这样做,那么Qt的优化将永远不会重绘。 这是采用同步。
在“不确定”看,你会为(像一个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库,我使用加载控件。 如果你想看到它的代码/使用它,它在http://dev.projexsoftware.com/projects/projexui和类是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
...