Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
 
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
#1

Закрытие дочернего окна и Qt-флаги - C++ Qt

02.06.2016, 16:27. Просмотров 2749. Ответов 24

Есть окно (QWidget) Form1, по нажатию кнопочки на нем создается другое окно (QWidget) Form2.

C++ (Qt)
1
2
Form2*f2 = new Form2(this);
f2->show();
При закрытии первой формы должна закрываться и вторая.

Как лучше всего это сделать?

Надеялась, что это можно сделать с помощью флагов.
Типа
C++ (Qt)
1
setWindowFlags(Qt::Dialog);
Потом надеялась, что при закрытии Form1 испускает какой-то сигнал.
И писать бы тогда в конструкторе Form2:

C++ (Qt)
1
connect(parent, &QWidget::iamclosed, this, &QWidget::close);
Не нашла.

Вопрос, а как лучше? (Читай как делают нормальные люди)
Если учесть, что Form2 будет создаваться не только в Form1.
Наследовать все формы, в которых вызывается Form1 от чего-то (и вообще чего?), имеющего сигнал iamclosed и испускающего его при закрытии вроде слишком хитро закручено...
Варианты у меня такие:
1) Все таки есть какой-то флаг, найти его и безудержно радоваться
2) Добавить сигнал iamclosed() в Form1 , испускать его при закрытии, коннект делать после создания формы Form2
3) Добавить сигнал iamclosed() в Form1 , испускать его при закрытии, коннект делать в конструкторе Form2

Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2016, 16:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Закрытие дочернего окна и Qt-флаги (C++ Qt):

Связь основного и дочернего окна
Попытался осуществить связь основного и дочернего окна, но нечего не вышло. ...

Событие активации дочернего mdi окна
Добрый день! На форме создан QMdiArea, а в нем несколько дочерних mdi-окон....

Закрытие окна кнопкой
Добрый вечер. Подскажите пожалуйста как закрыть окно кнопкой. Вот что имеется...

Закрытие окна формы
Привет всем, такой вопрос, как можно вызывать события по закрытию окна. Делаю...

Закрытие диалогового окна из слота
Приветствую! Надеюсь сможете помочь с решением данной задачи: Если смотреть...

Закрытие окна/приложения из кода
нужно закрыть окна/приложения из кода( т. е. скажем по условию х=2 закрываем...

24
nmcf
6240 / 5552 / 2527
Регистрация: 14.04.2014
Сообщений: 23,345
02.06.2016, 16:39 #2
А почему не QDialog или QMainWindow?
0
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
02.06.2016, 16:50  [ТС] #3
Потому что QWidget самый "базовый"))
С QDialog`ом пробовала, там то же самое.
Наследовать все окна приложения от QMainWindow как-то нелогично. Все его тулбары и тд нужны только для главного окна.
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
02.06.2016, 17:37 #4
Цитата Сообщение от traktort Посмотреть сообщение
При закрытии первой формы должна закрываться и вторая.
Первая форма удаляется?
0
nmcf
6240 / 5552 / 2527
Регистрация: 14.04.2014
Сообщений: 23,345
02.06.2016, 17:41 #5
Если ты указываешь первую формы как родителя второй, то при удалении первой вторая тоже удалится. Или что ты закрытием называешь?
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
02.06.2016, 17:59 #6
Посмотрел внимательнее. Переопределяй функцию CloseEvent у виджета и закрывай там какие угодно другие окна. =)
По другому без удаления - никак.
0
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
03.06.2016, 08:40  [ТС] #7
Если ты указываешь первую формы как родителя второй, то при удалении первой вторая тоже удалится. Или что ты закрытием называешь?
Закрытием называю нажатие красного крестика справа вверху и полнейшее исчезновение формы с экрана))

Первую форму указываю как родительскую. Но в таком случае вторая форма вставляется прям в первую. Чтобы вторая форма была отдельным окном, в ее конструкторе добавила:
C++ (Qt)
1
setWindowFlags(Qt::Dialog);
Но после этого форма2 не закрывается при закрытии формы1.
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
03.06.2016, 10:09 #8
Закрытием называю нажатие красного крестика справа вверху и полнейшее исчезновение формы с экрана))
Форма может быть не удалена, а просто скрыта. "Исчезновение формы с экрана" не обязательно является следствием уничтожению объекта.

Первую форму указываю как родительскую. Но в таком случае вторая форма вставляется прям в первую.
Абсолютно естественное поведение для виджета.

Чтобы вторая форма была отдельным окном
Иными словами, вы собираетесь из формы наплодить множество виджетов верхнего уровня, не имеющих родителя, только для того, чтобы они отображались в виде отдельных окон. Тогда заведите список указателей, в который будете добавлять указатель на каждый вновь порожденный виджет. А удалять их при закрытии формы можно, как вам посоветовали выше, в обработчике closeEvent вашей формы: перебираете список и "глушите" их "пачками". Но при реализации такого подхода вы получите проблему поддержания актуальности списка указателей: "вторичные" окна ведь могут быть закрыты не обязательно все сразу и в произвольном порядке. Придется как-то уведомлять "исходное" окно об этом, скорей всего при помощи сигнально-слотовых соединений, число которых будет расти с увеличением количества "вторичных" форм.

Существует и другой недостаток подобного подхода, создание top-level виджета - это "дорогой" процесс, в котором задействована оконная система ОС.

ИМХО, ваш способ построения UI - это просто способ нажить себе проблем. Куда логичней поместить в качестве "центрального виджета" вашего потомка QMainWindow какой-либо контейнерный виджет, пригодный для организации MDI-интерфейса, например QMdiArea.
0
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
03.06.2016, 11:04  [ТС] #9
Цитата Сообщение от Wyn Посмотреть сообщение
Переопределяй функцию CloseEvent у виджета и закрывай там какие угодно другие окна. =)
По другому без удаления - никак.
В таком случае в h-файле Form1 мне нужно объявлять
C++ (Qt)
1
Form2 *form2;
.
Сейчас у меня прям в слоте кнопочки первой формы :
C++ (Qt)
1
2
Form2 *form2 = new Form2();
form2->show();
То есть если на Form1 сто кнопочек, по нажатию которых появляются окна Form2, Form3 и тд... То в h-файле будет объявлено сто форм. Даже если эти кнопки никто не жмет.
Мне не сложно перенести все в h-файл, просто хочу понять как красивее/менее криворуко ))

Сейчас в form1 испускаю сигнал iamclosed(), а в конструкторе всех форм Form2, Form3 и тд... вот что:
C++ (Qt)
1
connect( parent, SIGNAL(iamclosed()), this, SLOT(close()) );
Добавлено через 13 минут
Цитата Сообщение от 0x90h Посмотреть сообщение
Форма может быть не удалена, а просто скрыта. "Исчезновение формы с экрана" не обязательно является следствием уничтожению объекта.
Пишу в конструкторе форм:
C++ (Qt)
1
setAttribute(Qt::WA_DeleteOnClose, true);
Память освобождается.

Иными словами, вы собираетесь из формы наплодить множество виджетов верхнего уровня, не имеющих родителя,
Нет, родитель у них есть! Вот что нашла, например, про Qt::Window
--Сообщает, что виджет является окном, обычно имее рамку и панель заголовка, независимо от того, имеет ли виджет родителя или нет.


Тогда заведите список указателей, в который будете добавлять указатель на каждый вновь порожденный виджет. А удалять их при закрытии формы можно, как вам посоветовали выше, в обработчике closeEvent вашей формы: перебираете список и "глушите" их "пачками". Но при реализации такого подхода вы получите проблему поддержания актуальности списка указателей: "вторичные" окна ведь могут быть закрыты не обязательно все сразу и в произвольном порядке. Придется как-то уведомлять "исходное" окно об этом, скорей всего при помощи сигнально-слотовых соединений, число которых будет расти с увеличением количества "вторичных" форм.
Мне кажется, я куда проще делаю, выше в посте описала. В основной форме бросаю сигнал - анукавсезакройтесь, а во всех формах пишу коннект этого сигнала родителя с close() самой формы2/3/4/....

Куда логичней поместить в качестве "центрального виджета" вашего потомка QMainWindow какой-либо контейнерный виджет, пригодный для организации MDI-интерфейса, например QMdiArea.
Тут дело даже не в том, что я еще не пробовала такое сделать, а только знаю про существование MDI в Qt... Дело в том, что надо все сделать для маленького экранчика, там это будет пыткой))
0
pdn_mail
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50
03.06.2016, 11:33 #10
Вопрос, как создать дочернюю форму чтобы она не прорисовывалась на главном окне и закрывалась при закрытии главного окна.
если пишу
C++ (Qt)
1
Form *form=new Form(this);
то окно впечатывается в главную форму.
Когда-то видел подобный вопрос и ответ на него, но найти не могу.

 Комментарий модератора 
Сообщение перенесено из другой темы
0
nmcf
6240 / 5552 / 2527
Регистрация: 14.04.2014
Сообщений: 23,345
03.06.2016, 13:34 #11
В чём суть задачи-то? Как это выглядит? Висят прямоугольники без заголовков поверх рабочего стола, что ли?
Цитата Сообщение от traktort Посмотреть сообщение
Дело в том, что надо все сделать для маленького экранчика, там это будет пыткой))
Как это связано с размером экрана?
0
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
03.06.2016, 14:03  [ТС] #12
Цитата Сообщение от nmcf Посмотреть сообщение
В чём суть задачи-то? Как это выглядит?
Для примера - откройте какой-нибудь word, нажмите ctrl+h. Откроется окно "Найти и заменить". Если закроете word`овое окно, то закроется и окно "Найти и заменить".

Надо аналогичное)
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
03.06.2016, 15:00 #13
Цитата Сообщение от traktort Посмотреть сообщение
Для примера - откройте какой-нибудь word, нажмите ctrl+h. Откроется окно "Найти и заменить". Если закроете word`овое окно, то закроется и окно "Найти и заменить".
Надо аналогичное)
Так вы программу закрываете. В Qt тоже при закрытии главного окна программа завершает свою работу и закрывает все окна.
0
pdn_mail
8 / 8 / 3
Регистрация: 20.10.2015
Сообщений: 50
03.06.2016, 15:12 #14
traktort, В данном случае вы всё правильно делаете, отлавливаете destroy главного окна и говорите всем остальным закрыться.
Но вас как и меня не устраивает такое. Нам с вами надо чтобы дочерние окна имели родителем главное окно.
Мой вопрос напрямую с этим связан, будет на него ответ, будет у нас работать так как хотим.

Вот вопрос, извините повторю:
Вопрос, как создать дочернюю форму чтобы она не прорисовывалась на главном окне и закрывалась при закрытии главного окна.
если пишу
C++ (Qt)
1
Form *form=new Form(this);
то окно впечатывается в главную форму.
Form, как и главное окно, создано в дизайнере

Нам надо чтобы оно было отдельно.
0
SkaDi
6 / 6 / 3
Регистрация: 30.09.2015
Сообщений: 105
03.06.2016, 15:32 #15
Цитата Сообщение от traktort Посмотреть сообщение
Для примера - откройте какой-нибудь word, нажмите ctrl+h. Откроется окно "Найти и заменить". Если закроете word`овое окно, то закроется и окно "Найти и заменить".
Надо аналогичное)
создаете виджет
C++ (Qt)
1
2
3
4
QWidget *new_widget=new QWidget();
new_widget->show(); показывает
new_widget->hide(); скрывает
delete new_widget; удаляет
сигнал о закрытии формы есть и это closeEvent, он является protected
в хедере
C++ (Qt)
1
2
protected:
    void closeEvent(QCloseEvent *event);
слот
C++ (Qt)
1
2
3
4
5
void MainWindow::closeEvent(QCloseEvent *event)
{
    delete f_ui;
   // f_ui->hide();
}
Цитата Сообщение от pdn_mail Посмотреть сообщение
Вопрос, как создать дочернюю форму чтобы она не прорисовывалась на главном окне и закрывалась при закрытии главного окна.
если пишу
C++ (QT)Выделить код
1
Form *form=new Form(this);
то окно впечатывается в главную форму.
Когда-то видел подобный вопрос и ответ на него, но найти не могу.
убери this, и форма отрисуется вне родителя
0
nmcf
6240 / 5552 / 2527
Регистрация: 14.04.2014
Сообщений: 23,345
03.06.2016, 15:52 #16
Цитата Сообщение от pdn_mail Посмотреть сообщение
как создать дочернюю форму чтобы она не прорисовывалась на главном окне и закрывалась при закрытии главного окна
Я никак не пойму, в чём там проблема. Если у тебя главное окно QMainWindow, а дочернее QDialog, то именно так и будет. Закроешь приложение - закроются все формы.
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
03.06.2016, 16:11 #17
Цитата Сообщение от nmcf Посмотреть сообщение
Я никак не пойму, в чём там проблема
Народ инстанцирует экземпляры формы, не указывая при этом родителя, примерно таким образом:
C++ (Qt)
1
Form2 *form2 = new Form2();
Тогда указатель на родителя получит значение по умолчанию = 0.

Это делается, чтобы получить отдельное окно (в контексте оконной системы ОС).
А поскольку эта форма не связана отношениями родитель/потомок с исходной (получается, что все формы являются виджетами верхнего уровня)... то несколько позже этот же народ начинает "страдать" в поисках способа решения им же созданной проблемы.
0
nmcf
6240 / 5552 / 2527
Регистрация: 14.04.2014
Сообщений: 23,345
03.06.2016, 16:46 #18
0x90h, но они же пишут, что закрывают главное окно. Можно иметь несколько главных и равнозначных окон?
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
03.06.2016, 16:55 #19
Допустим, вы создали форму, которая является потомком QWidget. Если инстанцировать ее с указанием в качестве родителя вашей исходной формы (пусть это будет для определенности потомок QMainWindow), то отдельного окна не будет, потомок QWidget будет отображен на исходной форме, как ее элемент.

Если инстанцировать этого же потомка QWidget без указания родителя, то получите отдельное окно, такое же окошко, как и исходная форма, но они не будут связаны отношением parent/child. И закрыв исходную форму, вы не получите автоматического закрытия потомка QWidget.

Вопрос решается наследованием от QDialog, форму-потомка от QDialog можно инстанцировать с указанием в качестве родителя исходной формы и потомок QDialog все равно будет отображен в отдельном окне при сохранении связи parent/child. В этом случае, закрытие главного окна приведет и к закрытию подчиненных форм.

Но в любом случае, непонятно стремление строить интерфейс на куче окон, сменяющих друг друга, как на карусели. Я выше упоминал о возможности построения MDI интерфейса, но для ТС чем-то не подходит...
1
nmcf
6240 / 5552 / 2527
Регистрация: 14.04.2014
Сообщений: 23,345
03.06.2016, 17:02 #20
0x90h, я понял про parent. Но ведь если главное окно закрыть, то и приложение закроется, а значит вообще всё, независимо от parent. Вот я о чём.
0
03.06.2016, 17:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2016, 17:02
Привет! Вот еще темы с решениями:

Отследить закрытие окна из панели задач
Необходимо различать два события 1. Нажатие на "крестик" 2. нажатие "закрыть"...

Закрытие приложения при закрытии диалогового окна
Очередная микротема от новичка в Qt) Подскажите как закрыть приложение при...

Закрытие окна по нажатию кнопки или клику вне его
Всем доброго времени суток. Несколько дней мучаюсь не могу придумать как...

QGraphicsItemAnimation - нет ли утечек памяти при закрытие главного окна во время анимации?
Привет, ну вот создаю я анимацию элемента QGraphicsScene... (перенёс в одну...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru