Gif动画在参考QStyleSheet静(Animated Gif static in QStyle

2019-09-21 01:01发布

我想用自定义样式表一QProgressBar的外观。 我想给它的动画,“不确定”的样子。 所以我做了一个GIF动画中的背景坚持QProgressBar::chunk

它精细显示出来,但图像是静态的,没有动画。 任何建议或解决方法?

我在OS X 10.8上运行的PyQt 4.9.4。

Answer 1:

所以,这是你面对一个稍微复杂的问题。

在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
        ...


文章来源: Animated Gif static in QStyleSheet