3

在我的 PyQt4 应用程序中,有一个功能允许用户保存avi文件。为此,在主窗口中实现了saveMovie方法:

def saveMovie(self):
    """ Let the user make a movie out of the current experiment. """
    filename = QtGui.QFileDialog.getSaveFileName(self, "Export Movie", "",
                                                 'AVI Movie File (*.avi)')

    if filename != "":
        dialog = QtGui.QProgressDialog('',
                                       QtCore.QString(),
                                       0, 100,
                                       self,
                                       QtCore.Qt.Dialog |
                                       QtCore.Qt.WindowTitleHint)

        dialog.setWindowModality(QtCore.Qt.WindowModal)
        dialog.setWindowTitle('Exporting Movie')
        dialog.setLabelText('Resampling...')

        dialog.show()

        make_movie(self.appStatus, filename, dialog)

        dialog.close()

我的想法是使用QProgressDialog来显示视频编码工作是如何进行的。
然而,选择文件名后,QFileDialog不会消失,整个应用程序保持无响应,直到make_movie函数完成。

我应该怎么做才能避免这种情况?

4

1 回答 1

2

经验教训:如果您有一些长时间运行的操作要做——例如,读取或写入一个文件,请将它们移动到另一个线程,否则它们将冻结 UI。

因此,我创建了 , 的子类QThreadMovieMakerrun方法封装了之前实现的功能make_movie

class MovieMaker(QThread):
    def __init__(self, uAppStatus, uFilename):
        QtCore.QThread.__init__(self, parent=None)
        self.appStatus = uAppStatus
        self.filename = uFilename

    def run(self):
        ## make the movie and save it on file

让我们回到saveMovie方法。make_movie在这里,我用以下代码替换了原来的调用:

self.mm = MovieMaker(self.appStatus,
                     filename)

self.connect(self.mm, QtCore.SIGNAL("Progress(int)"),
             self.updateProgressDialog)

self.mm.start()

请注意我是如何定义一个新信号Progress(int)
这样的信号由MovieMaker线程发出以更新QProgressDialog用于向用户显示电影编码工作的进展情况。

于 2013-03-01T20:33:53.803 回答