Найти тему

Программирование на языке Python. Библиотека PyQt5. Немодальные окна QWidget

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Пример создания не модальных окон и их взаимодействия

Данная статья продолжает темы многооконности, которая была начата в статье о модальных окнах. Теперь будем рассматривать немодальные окна. Для их создания можно использовать опять же QWidget (хотя можно, конечно и QDialog). Немодальное окно не блокирует доступ к другим окнам. И в этом есть свои сложности. Какие они?

  1. При закрытии главного окна, открытые окна остаются.
  2. Количество открытых окон неограниченно.
  3. Действия в окнах возможно придётся как-то синхронизировать.

Кстати, заметьте, в предыдущей статье действия в модальном окне и родительском окне синхронизировались в реальном времени. Но это было не обязательно, всё равно доступ к родительскому окну возникал только после закрытия дочернего. Можно было внести все изменения после закрытия дочернего окна. А вот в случае немодальных окон синхронизация важна именно в момент действия.

Ответ на три поставленных проблемы на самом деле один: нужно вести реестр открытых немодальных окон. По сути это и всё и статью можно было бы заканчивать, а реализацию оставить читателям. Но я так не поступлю, потому как и сам хочу получить удовольствие от программирования, впрочем не сложного.

Ниже представлена программа (см. Рисунок 1). Заметим, что при закрытии главного (родительского) окна, закрываются все созданные немодальные окна.

Скриншот фрагмента программы (класс win). Полный текст программы см. по ссылк ниже
Скриншот фрагмента программы (класс win). Полный текст программы см. по ссылк ниже
Скриншот фрагмента программы (класс winm и основная программа). Полный текст программы см. ниже по ссылке
Скриншот фрагмента программы (класс winm и основная программа). Полный текст программы см. ниже по ссылке
primer244.py

Пояснения к программе

  • В первую очередь обращу внимание на список self.lsw. Здесь и предполагается хранить объекты - немодальные окна. При создании окна, выполняется
    w = winm(self)
    self.lsw.append(w)
    self.lsw[-1].show()
  • При закрытии главного (родительского) окна (событие QWidget.closeEvent()) удаляются все созданные модальные окна. Тут важно понять зачем нам список lsw1, если и так все окна хранятся в списке lsw. Смысл прост: когда немодальное окно закрывается, оно удаляет себя из списка lsw.
  • При вводе текста в строке ввода главного окна содержимое тут же дублируется во все существующие немодальные окна (см. функцию tom() класса win).
  • В функции tom() класса winm также дублируются содержимое строки ввода из текущего немодального окна во все остальные окна.
  • При создании нового немодального окна содержимое строки ввода главного окна копируется в строку ввода создаваемого окна (см. initUI() класса winm).
  • При закрытии немодального (событие closeEvent()) объект окна удаляется из списка lsw (метод remove()).

Вот в общем то и весь механизм. Берите на вооружение.

Рисунок 1
Рисунок 1

Ну, пока всё!

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

Вы закрыли дверь, но окна остались открытыми
Вы закрыли дверь, но окна остались открытыми