Почему QApplication.setOverrideCursor не влияет на эту функцию?

Я создаю относительно простой пользовательский интерфейс, используя PyQt5. В приложении есть несколько точек, которые запускают процесс, требующий некоторого времени, поэтому я использовал QApplication.setOverrideCursor, чтобы указать, что процесс запущен.

Это делается с помощью этого декоратора (взято из этот вопрос):

def waiting_effects(function):
    def new_function(self):
        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
        function(self)
        QtWidgets.QApplication.restoreOverrideCursor()
    return new_function

Это работает для большинства методов в классе пользовательского интерфейса, кроме одного:

@waiting_effects
def load_data_folder(self):

        folder = QtWidgets.QFileDialog.getExistingDirectory(self)

        if folder:
            self.clear_plot(name="All")
            self.vr_headers = []
            self.ls_headers = []
            self.df = pvi.import_folder(folder)

            if self.df['voltage recording'] is not None:
                self.vr_headers = self.df['voltage recording'].columns[1:].tolist()
                self.sweeps = self.df['voltage recording'].index.levels[0]

            if self.df['linescan'] is not None:
                self.ls_headers = self.df['linescan'].columns[1::2].tolist()

                if self.df['voltage recording'] is None:
                    self.sweeps = self.df['linescan'].index.levels[0]

                self.ratio_dropdown1.clear()
                self.ratio_dropdown2.clear()
                for profile in self.ls_headers:
                    self.ratio_dropdown1.addItem(profile)
                    self.ratio_dropdown2.addItem(profile)

                self.tabWidget.setTabEnabled(2, True)

            elif self.tabWidget.isTabEnabled(2):
                self.tabWidget.setTabEnabled(2, False)

            self.update_treeWidget()

Декоратор @waiting_effects в этом случае не производит никакого изменения курсора.

Вместо использования декоратора я попытался обернуть блок кода после QFileDialog с помощью QApplication.setOverrideCursor, но это не сработало. То есть:

def load_data_folder(self):

        folder = QtWidgets.QFileDialog.getExistingDirectory(self)

        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
        if folder:
            self.clear_plot(name="All")
            self.vr_headers = []
            self.ls_headers = []
            self.df = pvi.import_folder(folder)

            if self.df['voltage recording'] is not None:
                self.vr_headers = self.df['voltage recording'].columns[1:].tolist()
                self.sweeps = self.df['voltage recording'].index.levels[0]

            if self.df['linescan'] is not None:
                self.ls_headers = self.df['linescan'].columns[1::2].tolist()

                if self.df['voltage recording'] is None:
                    self.sweeps = self.df['linescan'].index.levels[0]

                self.ratio_dropdown1.clear()
                self.ratio_dropdown2.clear()
                for profile in self.ls_headers:
                    self.ratio_dropdown1.addItem(profile)
                    self.ratio_dropdown2.addItem(profile)

                self.tabWidget.setTabEnabled(2, True)

            elif self.tabWidget.isTabEnabled(2):
                self.tabWidget.setTabEnabled(2, False)

            self.update_treeWidget()
        QtWidgets.QApplication.restoreOverrideCursor()

Медленная часть этой функции — строка:

self.df = pvi.import_folder(folder)

Эта import_folder — функция из другого написанного мной модуля, которая загружает папки данных, созданные нашим программным обеспечением для сбора данных. Я попытался обернуть только эту строку с помощью QApplication.setOverrideCursor, но опять же это не дало никакого эффекта.

Любые мысли/предложения о том, что здесь может происходить?

Спасибо


person dan_g    schedule 10.12.2014    source источник
comment
Я не могу проверить ваш код, но попробуйте поставить QtWidgets.qApp.processEvents() сразу после строки, которая устанавливает курсор.   -  person ekhumoro    schedule 10.12.2014
comment
Да, это сделало это. Спасибо! Не стесняйтесь поместить это в ответ, и я отмечу правильный   -  person dan_g    schedule 12.12.2014
comment
Кроме того, если вы не возражаете, объясните, какую проблему решает эта строка кода?   -  person dan_g    schedule 12.12.2014


Ответы (1)


Похоже, что функция load_data_folder выполняется в основном потоке графического интерфейса, поэтому она будет блокировать любые дальнейшие обновления графического интерфейса до завершения.

Попробуйте поставить QtWidgets.qApp.processEvents() сразу после строки, которая устанавливает курсор, и это должно позволить обновить курсор до запуска функции.

person ekhumoro    schedule 11.12.2014