Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QStyleSheet中的动画Gif静态_Qt_Stylesheet_Gif_Animated_Qtstylesheets - Fatal编程技术网

Qt QStyleSheet中的动画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的外观。我想给它一个生动的“不确定”的外观。因此,我制作了一个动画GIF,粘贴在
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和一个标签,你根据完成的百分比影响了宽度。这将是一个有用的小部件。