Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
К вопросу о закрытии окна нажатием на значок в полосе заголовка.
Запись от iamvic размещена 11.05.2021 в 21:10
Показов 7372
Комментарии 2
|
В теме Изменение событий дочернего окна, поднятой katyuhma, неожиданно вспомнилась ещё одна проблемка, с которой когда-то пришлось повозиться, но решение так и не оформилось в виде текста. Восполняю пробел. Суть-то простая - открытое окно приложения, имеющее стандартное оформление, можно закрыть по крайней мере двумя способами: - вызовом close() в коде приложения, - нажатием на значок закрытия в заголовке окна (сюда же относятся выбор пункта <Закрыть> в выпадающем меню после нажатия на значок приложения, а также нажатие комбинации клавиш Alt-F4). А если по закрытию окна требуется выполнять некоторые тяжёлые критические действия, например, освобождать ресурсы, сохранять состояние и прочее, то есть ли существенная разница в том, как и где это следует делать в первом случае и во втором? Перед написанием пробника было полезно освежить знания чтением документации https://doc.qt.io/qt-5/qwidget.html#close (кой-чего не знал, да и забыл). Итак, слот QWidget.close(): - закрывает виджет, - возвращает true, если виджет был закрыт; в противном случае возвращается false. Слот? Возвращает значение? Это как? Надо проверить. - сначала он отправляет виджету QCloseEvent. Виджет прячется, если принимает событие закрытия. Если он игнорирует событие, ничего не происходит. Реализация QWidget.closeEvent() по умолчанию принимает событие закрытия. Тут уже становится понятно ЧТО надо проверить и КАК...
1. выход выбором пункта меню Файл --> Выход (или нажатием Ctrl-Q):
пункта <Закрыть> в выпадающем меню после нажатия на значок приложения, или нажатием комбинации клавиш Alt-F4):
выполнять все действия по закрытию в обработчике closeEvent(), поскольку события QCloseEvent от внешних источников поступают на обработку только туда. И, наверняка, для большинства случаев подойдёт именно этот вариант. С другой стороны, хотелось бы немного большей свободы действий в случае необходимости выполнения тяжёлых критических операций, например, по сохранению текущего состояния и т.д. Впрочем, возможность отфильтровать события QCloseEvent, поступающие от внешних источников, есть. А вот ситуацию с невозвратом значений из QWidget.close() пока интерпретировать правильно не могу. Добавлю пример, чтобы стало понятнее. Вот таким нехитрым способом можно запретить закрывать окно нажатием на значок закрытия в заголовке:
тоже не будет лишним, наверное:
| |||||||||||||||||||||||||
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
-
Все хорошо, но, есть пару замечаний:
1) Это PEP-8, стоит хорошенько его вызубрить чтоб код более читабельный писать.
2) Лучше написать код, а ниже расписывать каждую строчку, так будет более понятно и читабельнее.
Немного кода от себя:
Кликните здесь для просмотра всего текста
Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
import sys from PySide2 import QtWidgets, QtGui class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent: QtWidgets.QWidget = None): QtWidgets.QMainWindow.__init__(self, parent) self.setWindowTitle("Example: [Close Event]") QtWidgets.QShortcut(QtGui.QKeySequence("Alt+F4"), self, self.close) if not parent: self.show() def closeEvent(self, event: QtGui.QCloseEvent) -> None: if QtWidgets.QMessageBox.question( self, "Closing the program", "Are you sure you want to exit the program?", (QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.Cancel)) != QtWidgets.QMessageBox.Yes: return event.ignore() # Действия при закрытии главного окна return event.ignore() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) main = MainWindow() sys.exit(app.exec_())
Запись от Fudthhh размещена 18.05.2021 в 08:00
-
Fudthhh, спасибо за добрые слова и пример правильного
оформления текста программ
. Моя беда в том, что опыт мой отягощён
давними прочными беспорядочными связями с другими языками программирования
и, соответственно, иной стилистикой. Это несколько мешает усвоению
рекомендаций PEP 8 и постоянно прорывается, несмотря на то, что я работаю
над этим недостатком. Утешаю себя мыслью, что пункт 2 из PEP 8 в своих проектах
и в ответах на форуме старюсь блюсти строго
Запись от iamvic размещена 19.05.2021 в 17:27

. Моя беда в том, что опыт мой отягощён

