Начало
Модальным называется окно, которое нельзя взаимодействовать с другими окнами. Пример пользователь нажал на кнопку "Обзор", то у неuj открывается приложения с множествами файлами, который надо выбрать из них, и пока пользователь не выберет из них, то окно будет бесконечным который мы ранее открывали, тоесть мы не сможем открыть..
Модальные окна
Чтобы сделать модальным окно, для этого существует метод setWindowModality(<Флаг>) из класса QWidget. В качестве параметра могут быть указаны следующие атрибуты из класса QtCore:- NonModal - окно не является модальным.
- WindowModal - окно блокирует только родительские окна в пределах иерархии.
- ApplicationWindow - окно блокирует все окна в приложении
Python:
from PyQt5 import QtWidgets, QtCore # Импортируем необходимые библиотеки;
import sys
def show_modal_window(): # Создаем фунцкию;
global modalWindow
modalWindow = QtWidgets.QWidget(window1, QtCore.Qt.Window)
modalWindow.setWindowTitle('Модальное окно')
modalWindow.resize(200, 50)
modalWindow.setWindowModality(QtCore.Qt.WindowModal)
modalWindow.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
modalWindow.move(window1.geometry().center() - modalWindow.rect()
.center() - QtCore.QPoint(40, 30))
modalWindow.show()
app = QtWidgets.QApplication(sys.argv)
window1 = QtWidgets.QWidget() # Создает окно;
window1.setWindowTitle('Обычное окно')
window1.resize(300, 100)
btn = QtWidgets.QPushButton('Открыть модальное окно')
btn.clicked.connect(show_modal_window)
vbox = QtWidgets.QVBoxLayout()
vbox.addWidget(btn)
window1.setLayout(vbox)
window1.show()
window2 = QtWidgets.QWidget()
window2.setWindowTitle('БЛОКИРОВАНО') # Это окно не будет блокировано при WindowModal;
window2.resize(500, 100)
window2.show()
sys.exit(app.exec_())
Итого:
Если запустить приложение и нажать кнопку Открыть модальное окно, откроется окно, выровненное примерно центру родительского окна. При этом получить доступ к родительскому окну можно только после закрытия модального окна, второе же оно блокировано не будет. Если заменить атрибут WindowModal атриубтом ApplicationModal, то оба окна буду блокированы.
Надеюсь данная статья была полезна. Всем удачи.
Последнее редактирование: