Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Пример создания не модальных окон и их взаимодействия
Данная статья продолжает темы многооконности, которая была начата в статье о модальных окнах. Теперь будем рассматривать немодальные окна. Для их создания можно использовать опять же QWidget (хотя можно, конечно и QDialog). Немодальное окно не блокирует доступ к другим окнам. И в этом есть свои сложности. Какие они?
- При закрытии главного окна, открытые окна остаются.
- Количество открытых окон неограниченно.
- Действия в окнах возможно придётся как-то синхронизировать.
Кстати, заметьте, в предыдущей статье действия в модальном окне и родительском окне синхронизировались в реальном времени. Но это было не обязательно, всё равно доступ к родительскому окну возникал только после закрытия дочернего. Можно было внести все изменения после закрытия дочернего окна. А вот в случае немодальных окон синхронизация важна именно в момент действия.
Ответ на три поставленных проблемы на самом деле один: нужно вести реестр открытых немодальных окон. По сути это и всё и статью можно было бы заканчивать, а реализацию оставить читателям. Но я так не поступлю, потому как и сам хочу получить удовольствие от программирования, впрочем не сложного.
Ниже представлена программа (см. Рисунок 1). Заметим, что при закрытии главного (родительского) окна, закрываются все созданные немодальные окна.
Пояснения к программе
- В первую очередь обращу внимание на список 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()).
Вот в общем то и весь механизм. Берите на вооружение.
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.