Форум программистов, компьютерный форум, киберфорум
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
 
traktort
6 / 6 / 3
Регистрация: 05.11.2014
Сообщений: 67
#1

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

02.06.2016, 16:27. Просмотров 1677. Ответов 23

Есть окно (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):

Связь основного и дочернего окна - C++ Qt
Попытался осуществить связь основного и дочернего окна, но нечего не вышло. Нужно, чтобы при нажатие кнопки в основном окне, текст...

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

Закрытие окна формы - C++ Qt
Привет всем, такой вопрос, как можно вызывать события по закрытию окна. Делаю так: protected: virtual void closeEvent (...

Закрытие окна кнопкой - C++ Qt
Добрый вечер. Подскажите пожалуйста как закрыть окно кнопкой. Вот что имеется main.cpp, mainwindow.cpp, mainwindow.h, mainwindow.ui,...

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

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

23
nmcf
5524 / 4834 / 1638
Регистрация: 14.04.2014
Сообщений: 19,618
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
Модератор
1047 / 629 / 231
Регистрация: 14.01.2016
Сообщений: 2,034
Записей в блоге: 9
02.06.2016, 17:37 #4
Цитата Сообщение от traktort Посмотреть сообщение
При закрытии первой формы должна закрываться и вторая.
Первая форма удаляется?
0
nmcf
5524 / 4834 / 1638
Регистрация: 14.04.2014
Сообщений: 19,618
02.06.2016, 17:41 #5
Если ты указываешь первую формы как родителя второй, то при удалении первой вторая тоже удалится. Или что ты закрытием называешь?
0
Wyn
Модератор
1047 / 629 / 231
Регистрация: 14.01.2016
Сообщений: 2,034
Записей в блоге: 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
291 / 257 / 91
Регистрация: 01.10.2015
Сообщений: 808
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
5524 / 4834 / 1638
Регистрация: 14.04.2014
Сообщений: 19,618
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
Модератор
1047 / 629 / 231
Регистрация: 14.01.2016
Сообщений: 2,034
Записей в блоге: 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
4 / 4 / 1
Регистрация: 30.09.2015
Сообщений: 97
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
03.06.2016, 15:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2016, 15:32
Привет! Вот еще темы с ответами:

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

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

Закрытие окна по нажатию кнопки или клику вне его - C++ Qt
Всем доброго времени суток. Несколько дней мучаюсь не могу придумать как реализовать. Есть окно в котором кнопка, при нажатии на которую...

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


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

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

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