Я строю относительно простой интерфейс с использованием PyQt5. В приложении есть несколько моментов, которые запускают процесс, который занимает некоторое время, поэтому я использовал QApplication.setOverrideCursor, чтобы указать, что процесс запущен.QApplication.setOverrideCursor не влияет на эту функцию, почему?
Это делается с помощью этого декоратора (взято из this question):
def waiting_effects(function):
def new_function(self):
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
function(self)
QtWidgets.QApplication.restoreOverrideCursor()
return new_function
Это работает для большинства методов в классе UI, за исключением одного:
@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()' сразу после строки, которая устанавливает курсор. – ekhumoro
Yup, это сделал. Благодаря! Не стесняйтесь ответить на него, и я отметю правильно – user3014097
Кроме того, если вы не возражаете объяснить, в чем проблема, связанная с этой строкой кода? – user3014097