Я создаю относительно простой пользовательский интерфейс, используя 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, но опять же это не дало никакого эффекта.
Любые мысли/предложения о том, что здесь может происходить?
Спасибо
QtWidgets.qApp.processEvents()
сразу после строки, которая устанавливает курсор. - person ekhumoro   schedule 10.12.2014