Russian Qt Forum
Апрель 29, 2024, 00:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить указатель на главное окно  (Прочитано 3511 раз)
softminister
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« : Апрель 28, 2021, 09:01 »

Qt только осваиваю, поэтому возникают такие вопросы.

Есть приложение на основе QDialog. Главное окно создает дочернее окно на основе QDialog.

Как из дочернего окна получить доступ к public-методам главного окна?

На просторах сети нашел метод получения указателя на главное окно:

MainDialog *nw = qobject_cast<MainDialog*>( QApplication::topLevelWidgets()[ 0 ] );

Но видимо этот способ недостаточно безопасный, т.к. в половине случаев программа вылетает без объяснения каких-либо причин из-за этого, потому что оказывается nw=0. Видимо вылетает исключение. Поэтому такой способ не подходит. Кстати, почему вылетает?

Объясните, как правильно поступить в такой простейшей ситуации? Как обращаться к функциям главного окна из дочерних окон?
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #1 : Апрель 28, 2021, 10:39 »

Цитировать
Как обращаться к функциям главного окна из дочерних окон?
Ни как. ИМХО. Нефиг детям соваться в родительскую спальню. Запускайте из дочерних окон сигнал, в родительских обрабатывайте слотами.
« Последнее редактирование: Апрель 28, 2021, 10:44 от juvf » Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #2 : Апрель 28, 2021, 10:49 »

чтобы не вылетало, надо:
1. Проверить условие QApplication::topLevelWidgets().size() > 0
2. Проверить условие nullptr != nw
Если оба условия прошли, можно дальше работать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 28, 2021, 11:02 »

Кстати, почему вылетает?
Потому что topLevelWidget может быть любым. а не только MainDialog

Объясните, как правильно поступить в такой простейшей ситуации? Как обращаться к функциям главного окна из дочерних окон?
Как уже сказали, лезть их дочернего в главное неграмотно, т.е. Вы спрашиваете "как правильно сделать неправильно" Улыбающийся Если же все-таки "ну вот надо", то можно напр так
Код
C++ (Qt)
MainDialog * GetParentMainDialog( QWidget * child )
{
 while (child ) {
   MainDialog * mw = dynamic_cast<MainDialog*> (child);
   if (mw) return mw;
   child = child->parentWidget();
}
Q_ASSERT(0);
return 0;
}
Или через qApp->toLevelWidgets. Или через глобальную переменную (QPointer). Но лучше всего никак не лезть  Улыбающийся
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #4 : Апрель 28, 2021, 11:12 »

Если же все-таки "ну вот надо", то можно напр так
при рождении дочери создании дочернего окна сообщить мать её передать указатель/ссылку на главное окно (или сообщить потом сеттером) и дочке запомнить указатель/ссылку в своих приватах.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 28, 2021, 11:28 »

при рождении дочери создании дочернего окна сообщить мать её передать указатель/ссылку на главное окно (или сообщить потом сеттером) и дочке запомнить указатель/ссылку в своих приватах.
Не горячитесь. Зачем дочке еще член если он и так есть (парент)? И если это не дочка а внучка?  Улыбающийся
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #6 : Апрель 28, 2021, 11:38 »

Зачем дочке еще член если он и так есть (парент)? И если это не дочка а внучка?  Улыбающийся
Вы сами ответили на свой вопрос. Затем, что парентом может быть далеко не главное окно. Хоть внучка, хоть правнучка.... до 100 степени родства поколения - передать ссылку на Адама на главное окно, потом всегда можно напрямую обратиться к Путину, минуя министров к главному окну минуя парентов, без лишних розысков и проверок. ))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 28, 2021, 12:35 »

Затем, что ...
Не горячитесь Улыбающийся Не надо бросаться доказывать что Вы (и только Вы) правы. Вы и так это знаете, Ваша правота от Вас никуда не убежит. Гораздо полезнее посмотреть какие еще есть решения.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #8 : Апрель 28, 2021, 12:47 »

Затем, что ...
Не горячитесь Улыбающийся Не надо бросаться доказывать что Вы (и только Вы) правы. Вы и так это знаете, Ваша правота от Вас никуда не убежит. Гораздо полезнее посмотреть какие еще есть решения.
я ваш вариант не отбрасываю, это вы мой баните и пытаетесь мне доказать, что мой путь плох.  ))... Я вам про ваш код ни слова не сказал. Вариантов много... какой лучше - и всё зависит от реализации app. По мне, так вообще, если маинВиндоу сделал дочку, то ни какие поиски, дополнительные члены дочке или QApplication::topLevelWidgets() не нужны. Есть QWidget::parentWidget() - необходимо и достаточно. Но если есть дочки/внучки... если создатель не маинвиндоу... то тогда озвучено несколько вариантов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 22.