Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/30: Рейтинг темы: голосов - 30, средняя оценка - 4.70
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
PyQt5

Как создать заново и показать вторую форму в модальном режиме?

03.09.2021, 08:57. Показов 6801. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

Вторая форма находится в файле second_form.py:
Python
1
2
3
4
5
6
7
8
9
10
11
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
 
class SecondForm(QDialog):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle('Вторая форма')
        self.resize(200, 200)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setModal(True)
Первая стартовая форма:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
 
import second_form
 
class DlgMain(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Заголовок главного окна приложения')
        self.resize(400, 300)
 
        self.btnUpdate = QPushButton('Создать заново и показать вторую форму', self)
        self.btnUpdate.setGeometry(50, 200, 300, 50)
        self.btnUpdate.clicked.connect(self.evt_btn_update_clicked)  # Подсоединяем обработчик события clicked кнопки
 
    def evt_btn_update_clicked(self):
        dlg_second = SecondForm(self)  # Создание Второго окна приложения
        dlg_second.show()
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlgMain = DlgMain()
    dlgMain.show()
    sys.exit(app.exec_())
Вторая форма каждый раз при закрытии по крестику (а лучше по своей особой кнопке) должна гарантированно уничтожаться.
Что не так? Что лишнее? Как из первой формы увидеть переменную, изменённую во второй форме?

Добавлено через 3 минуты
Я ужен задавал подобный вопрос, но теперь задача изменилась. Вторая форма находится в отдельном файле.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2021, 08:57
Ответы с готовыми решениями:

Работа с Assigned - создать вторую форму, показать и закрыть
Создается форма- form2 := TForm2.Create(Owner); form2.ShowModal(); form2.Free; Потом закрываю форм2. Нажимаю кнопку - ...

Как показать вторую форму
Всем Привет Вопрос :как использовать Form2 Socket e внизу отметил код на красный цвет using System; using...

Как показать вторую форму
Сделал 2 форму "About", а как сделать так чтобы при нажатии на первой форме кнопки вылазила вторая ? Вещаю обработчик на первой форме: ...

30
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
10.09.2021, 15:37  [ТС]
Студворк — интернет-сервис помощи студентам
iamvic, Спасибо. Всё понял.

Не по теме:

Нашёл книгу Прохоренок Н., Дронов В. - Python 3 и PyQt 5. Разработка приложений - 2016.PDF, грызём потихоньку :)

0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
10.09.2021, 19:02
Цитата Сообщение от iamvic Посмотреть сообщение
У меня на Windows под VirtualBox это второе окошко даже
промаргивается и тут же исчезает.
так вы окно создаете внутри функции и по выходу переменная уничтожается
self надо добавлять, чтобы была постоянная ссылка. диалог модален, а QMainWindow нет

Добавлено через 2 минуты
jkrnd, попробуйте
Python
1
2
3
    def evt_btn_update_clicked(self):
        self.dlg_second = SecondForm(self)  # Создание Второго окна приложения
        self.dlg_second.show()
Добавлено через 1 час 5 минут
как говорится - почувствуйте разницу
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class W(QPushButton):
    def __init__(self):
        super().__init__()
        self.setText('Click')
        self.clicked.connect(self.on_click)
    
    def on_click(self):
        #m = QMainWindow()
        #m.show()
        self.m = QMainWindow()
        self.m.show()
        print('mainwindow')
 
        w = QDialog()
        w.exec_()
        print('dialog')
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
11.09.2021, 07:29  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
диалог модален, а QMainWindow нет
разве я не могу создать и запустить вторую форму из программы в модальном режиме если она наследуеся от QMainWindow, а не от QDialog?
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
11.09.2021, 07:37
нет. диалог сделан именно для модальных окон.
https://russianblogs.com/article/38551226099/
1
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
11.09.2021, 08:11
vic5710, Вы всё-таки не совсем правы, наверное. Судя по всему, ничто не мешает сделать модальным второе окно QMainWindow, вызваемое из первого QMainWindow.
Если вернуться к тем изменениям, которые я предлагал для проекта ТС, в выложенном им архиве, то тогда они должны выглядеть так:

first_form.py
Python
1
2
3
4
5
    def evt_btn1_clicked(self):
        # form = Calendar()  # Создание экземпляра класса Calendar
        form = Calendar(self)  # Создание экземпляра класса Calendar
        form.setWindowModality(QtCore.Qt.WindowModal)
        form.show()        # Показать форму
q_calendar.py
Python
1
2
3
4
5
    # Конструктор класса
    # def __init__(self):
        # super().__init__()  # Вызов конструктора класса-родителя
    def __init__(self, parent=None):
        super(Calendar, self).__init__(parent)  # Вызов конструктора класса-родителя
И второе окно, производное от QMainWindow, весьма успешно вызывается из первого по нажатию кнопки в этом случае как модальное.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
11.09.2021, 08:16  [ТС]
iamvic,
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
11.09.2021, 08:28
iamvic,

Не по теме:

можно. только зачем усложнять без нужды?

1
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
11.09.2021, 08:42
vic5710, я согласен с Вами, но в каждой избушке - свои погремушки
1
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
11.09.2021, 18:47
тут вы логику Qt нарушаете
модальное окно можно создать, отработать, удалить
а если несколько независимых немодальных окон - обычно их в конструкторе определяют и работают через show/hide
типа так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class W(QObject):
    def __init__(self):
        super().__init__()
        self.btn1 = QPushButton('btn1')
        self.btn2 = QPushButton('btn2')
        self.btn3 = QPushButton('btn3')
        
        self.btn1.setObjectName('btn1')
        self.btn2.setObjectName('btn2')
        self.btn3.setObjectName('btn3')
        
        self.btn1.clicked.connect(self.on_click)
        self.btn2.clicked.connect(self.on_click)
        self.btn3.clicked.connect(self.on_click)
        
        self.btn1.show()
        
    def on_click(self):
        obj = self.sender().objectName()
        if obj == 'btn1':
            self.btn1.hide()
            self.btn2.show()
        elif obj == 'btn2':
            self.btn2.hide()
            self.btn3.show()
        elif obj == 'btn3':
            self.btn3.hide()
            self.btn1.show()
1
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
12.09.2021, 14:05
Цитата Сообщение от vic5710 Посмотреть сообщение
тут вы логику Qt нарушаете
Честно говоря, я не очень понимаю такую суровую оценку.
На мой взгляд, тут не принципы Qt нарушаются, а рекомендуемый стиль программирования.
Ведь представленная моделька позволяет дать ответ на вопрос "возможно или невозможно?", а про "нужно или не нужно?" даже не заикается.
А поскольку ответ - "возможно", то довести её до ума труда особого не составит, когда станет "нужно".
При особом желании, дописав недостающие методы этого самописного класса, производного от QMainWindow, можно вполне успешно, как мне представляется, реализовать требуемую "модальность" и вписаться в положения рекомендуемого стиля.
1
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
12.09.2021, 18:59
Цитата Сообщение от iamvic Посмотреть сообщение
При особом желании, дописав недостающие методы этого самописного класса, производного от QMainWindow
а зачем? если уж приспичило - наследуйтесь от QMainWindow и QDialog и будут у вас все методы.
Qt перепилен вдоль и поперек, это набор технологий и какие-то велосипеды изобретать лично у меня ни желания ни времени не было. было техзадание, были сроки выполнения и в первую очередь об этом думал. людям лень читать доки вот и танцуют на граблях

Добавлено через 4 часа 35 минут
jkrnd, если б мне надо было работать с несколькими окнами по отдельности - я бы использовал QTabWidget, QStackedWidget. если с несколькими окнами одновременно - QMainWindow/MdiArea
https://coderlessons.com/tutor... -interfeis
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2021, 18:59

Как показать вторую форму из первой
Подскажите пожалуйста, что нужно чтобы банально вызвать форму из другой формы? Из кода в этой теме я понял, что форма вызывается...

Как показать вторую форму справа от первой?
Как показать вторую форму справа от первой ? на скрине пример

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

Открыть форму в модальном режиме
Как это сделать. При нажатии кнопки - чтобы открывалось уже созданное окно (форма) с названием About. Варианты, которые нашел на...

Заново показать форму после завершения стороннего процесса, запущенного из нее
Добрый день! Имеется форма, из которой запускается программа через WinExec. При запуске программы, форма невидима, пока работает программа....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru