Заметка [Python] - #7 Модальные окна PyQt5

Темы, которые НЕ подходят по объему под префикс "Статья"

Muxtar

Green Team
02.06.2021
132
65
BIT
0

Начало

Модальным называется окно, которое нельзя взаимодействовать с другими окнами. Пример пользователь нажал на кнопку "Обзор", то у неuj открывается приложения с множествами файлами, который надо выбрать из них, и пока пользователь не выберет из них, то окно будет бесконечным который мы ранее открывали, тоесть мы не сможем открыть..​




Модальные окна

Чтобы сделать модальным окно, для этого существует метод setWindowModality(<Флаг>) из класса QWidget. В качестве параметра могут быть указаны следующие атрибуты из класса QtCore:

  1. NonModal - окно не является модальным.
  2. WindowModal - окно блокирует только родительские окна в пределах иерархии.
  3. 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_())


Итого:
Снимок экрана от 2021-07-03 23-23-34.png


Если запустить приложение и нажать кнопку Открыть модальное окно, откроется окно, выровненное примерно центру родительского окна. При этом получить доступ к родительскому окну можно только после закрытия модального окна, второе же оно блокировано не будет. Если заменить атрибут WindowModal атриубтом ApplicationModal, то оба окна буду блокированы.



Надеюсь данная статья была полезна. Всем удачи.
 
Последнее редактирование:
  • Нравится
Реакции: Johan Van
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!