Шаг 45.
Библиотека PyQt5.
Управление окном приложения. Закрытие окна из программы

    На этом шаге мы рассмотрим реализацию этой операции.

    В предыдущих шагах для закрытия окна мы использовали слот quit() и метод exit([returnCode=0]) объекта приложения. Однако эти методы не только закрывают текущее окно, но и завершают выполнение всего приложения. Чтобы закрыть только текущее окно, следует воспользоваться методом close() класса QWidget. Метод возвращает значение True, если окно успешно закрыто, и False - в противном случае. Закрыть сразу все окна приложения позволяет слот closeAllWindows() класса QApplication.

    Если для окна атрибут WA_DeleteOnClose из класса QtCore.Qt установлен в значение True, то после закрытия окна объект окна будет автоматически удален, в противном случае окно просто скрывается. Значение атрибута можно изменить с помощью метода setAttribute():

  window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)

    После вызова метода close() или нажатия кнопки Закрыть в заголовке окна генерируется событие QEvent.Close. Если внутри класса определить метод с предопределенным названием closeEvent(), то это событие можно перехватить и обработать. В качестве параметра метод принимает объект класса QCloseEvent, который содержит методы accept() (позволяет закрыть окно) и ignore() (запрещает закрытие окна). Вызывая эти методы, можно контролировать процесс закрытия окна.

    В качестве примера закроем окно по нажатию кнопки.

# -*- coding:   utf-8  -*-
from PyQt5 import QtCore, QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget(flags=QtCore.Qt.Dialog)
window.setWindowTitle("Закрытие окна из программы")
window.resize(300, 70)
button = QtWidgets.QPushButton("Закрыть окно", window)
button.setFixedSize(150, 30)
button.move(75, 20)
button.clicked.connect(window.close)
window.show()
sys.exit(app.exec_())
Архив с файлом можно взять здесь.

    Внешний вид приложения изображен на рисунке 1.


Рис.1. Внешний вид приложения


   Примечание. Закрыв последнее окно приложения, мы тем самым автоматически завершим и само приложение. Не забывайте об этом.

    Со следующего шага мы начнем рассматривать обработку сигналов и событий.




Предыдущий шаг Содержание Следующий шаг