PyQt:选择文件后QtGui.QFileDialog.getSaveFileName窗口无法关闭

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 函数完成。
我该怎么做才能避免这种情况呢?

尝试添加一个对 processEvents() 的调用。请参考这个问题 - Junuxx
在if语句之前,我添加了对**QApplication.processEvents()**的调用,但不幸的是这并没有起作用。 - Loris Fichera
3
“processEvents()”需要进入阻塞部分。我想在这种情况下是“make_movie”。根据“make_movie”的实现,这可能会或可能不会解决问题。或者您可以将该部分移动到不同的线程中。 - Avaris
最终,我将 make_movie 移到了另一个线程中,以避免阻塞用户界面。很快会发布代码。 - Loris Fichera
1个回答

2

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

因此,我创建了一个名为MovieMakerQThread子类,其run方法封装了先前由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,以显示用户电影编码工作的进度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接