0 / 0 / 0
Регистрация: 12.06.2020
Сообщений: 41

Создание указателя на главное окно MainWindow

15.06.2020, 21:32. Показов 2542. Ответов 16

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи-программисты. Столкнулся с одной проблемой:
Имею главное окно MainWindow, также имею два виджета Chart и Sort. В каждом виджете мне нужен доступ к главному окну. В частности доступ из Chart в главное окно MainWindow происходит за счёт создание указателя:
C++ (Qt)
1
MainWindow *mainWin = dynamic_cast<MainWindow *>(lParent);
Так же создаю в классе Chart указатель на виджет:
C++ (Qt)
1
QWidget *lParent;
И в конструкторе класса Chart присваиваю указатели:
C++ (Qt)
1
lParent = parent;
В окне Chart всё работает прекрасно, но вот с Sort это не работает... В чём может быть проблема? Я получаю доступ к разным экземплярам класса или нет? Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2020, 21:32
Ответы с готовыми решениями:

Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается только главное невидимое
Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается только главное невидимое)) ) и как можно...

Как прижать окно MainWindow и окно второе к левому верхнему углу экрана?
Имеется MainWindow (которое по умолчанию) в приложении. Имеется созданное окно (второе). QMainWindow* secondWindow = new...

Закрыть дочернее окно и открыть в единственном экземпляре Главное окно
Есть главная форма Main Form , там кнопка Button 1 при нажатии на Button 1 открывыется дочерняя форма Form 1, на фомрме Form 1 есть кнопка...

16
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
15.06.2020, 21:45
Vulgar_Coder, телепаты не смогли разгадать не представленный в посте код (

Добавлено через 1 минуту
вариант уточнить, тот ли указатель: в отладке в main запомни значение указателя на экземпляр MainWindow , а в конструкторах классов сравни
0
0 / 0 / 0
Регистрация: 12.06.2020
Сообщений: 41
15.06.2020, 21:49  [ТС]
Пожалуйста, поподробнее, что значит запомнить значения в main?
Может быть код привести?
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
15.06.2020, 21:58
Цитата Сообщение от Vulgar_Coder Посмотреть сообщение
что значит запомнить значения в main
буквально - записать на бумажку, например. Хотя, проще скопипастить в блокнот )

Цитата Сообщение от Vulgar_Coder Посмотреть сообщение
код привести?
да
0
0 / 0 / 0
Регистрация: 12.06.2020
Сообщений: 41
15.06.2020, 22:16  [ТС]
Я не знаю как это работает, ноо:
MainWindow(0x211eb570, name="MainWindow") Chart
MainWindow(0x211eb570, name="MainWindow") Sort
Адреса вроде бы похоже, но почему тогда не работает указатель?
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
15.06.2020, 22:31
Vulgar_Coder, код нужен
0
Заблокирован
15.06.2020, 22:34
C++ (Qt)
1
CMainFrame* pFrame = DYNAMIC_DOWNCAST(CMainFrame, AfxGetApp()->m_pMainWnd);
0
фрилансер
 Аватар для Алексей1153
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,393
15.06.2020, 22:37
Hellraiser, не проканает Не MFC
0
15.06.2020, 22:39

Не по теме:

Алексей1153, как набросок...

0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
15.06.2020, 22:44
Цитата Сообщение от Vulgar_Coder Посмотреть сообщение
В каждом виджете мне нужен доступ к главному окну.
Покажите код этих виджетов (если это кастомные классы, а не встроенные). А вообще, вы их скорее всего создаете в конструкторе главного окна, так и передайте им в конструктор указатель на родителя (главное окно) через this, а внутри каждого из них получайте его через parent().
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
16.06.2020, 09:04
Цитата Сообщение от insite2012 Посмотреть сообщение
так и передайте им в конструктор указатель на родителя
Поддерживаю - это самый правильный подход.

Так же есть вариант сделать фасад, что-то типа:

C++ (Qt)
1
2
3
4
5
6
7
MainWindow * mwPointer(MainWindow *ptr = nullptr)
{
    static MainWindow * mvPtr = nullptr;
    if (ptr)
        mvPtr = ptr;
    return mvPtr;
}
соответственно в конструкторе MainWindow вызываем
C++ (Qt)
1
mvPointer(this):
а там где нужен указатель на MainWindow
C++ (Qt)
1
MainWindow *ptr = mvPointer();
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
16.06.2020, 09:22
Цитата Сообщение от Annemesski Посмотреть сообщение
это самый правильный подход.
Это самое простое, что можно придумать, хотя вариант, по правде говоря, так себе. Я его предложил как самый простой, но скорее всего, указатель нужен не сам по себе, а для работы с контролами. И искать их потом через указатель-затея не привлекательная. Да и прибивать виджеты друг к другу гвоздями-идея сомнительная. Я бы, конечно, реализовал сигнально-слотовые соединения, это более удобно и развяжет виджеты полностью друг от друга. В конструкторе главного окна создал виджеты, соединил их сигналы со слотами главного окна и все, а в слотах уже обрабатывал сигналы.
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
16.06.2020, 10:24
Цитата Сообщение от insite2012 Посмотреть сообщение
Я бы, конечно, реализовал сигнально-слотовые соединения
Вне всяких сомнений - это и есть парадигма Qt - её и будет правильнее всего использовать, но...

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

Опять таки... вряд ли задачи ТСа не могут быть решены через сигналы-слоты.
0
0 / 0 / 0
Регистрация: 12.06.2020
Сообщений: 41
16.06.2020, 14:04  [ТС]
Пожалуйста, можно поподробнее про:
C++ (Qt)
1
2
3
4
5
6
7
MainWindow * mwPointer(MainWindow *ptr = nullptr)
{
    static MainWindow * mvPtr = nullptr;
    if (ptr)
        mvPtr = ptr;
    return mvPtr;
}
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
16.06.2020, 14:31
Vulgar_Coder, объявляется статическая (то есть имеющая срок жизни равный времени исполнения всей программы) переменная типа указатель на MainWindow, так как переменная объявлена в теле функции, по имени она будет доступна только в теле функции (получить доступ вне тела функции возможно с помощью "особой уличной магии"). Изначально переменная инициализируется значением nullptr для возможности проверки и избежания краха приложения при попытке освободить память по этому указателю. Инициализируется один раз в момент запуска программы.

Из чего получается что если вызывать функцию с параметром ptr != nullptr - функция присвоит статической переменной переданный указатель - это используется при создании главного окна приложения, в конструкторе класса нужно вызвать функцию указав в качестве параметра this.

Далее, любой кому понадобиться указатель на главное окно может вызывать эту функцию без параметра или указав в качестве параметра nullptr присвоив возвращаемое значение переменной.
0
0 / 0 / 0
Регистрация: 12.06.2020
Сообщений: 41
16.06.2020, 14:51  [ТС]
Я создал такой указатель, но почему-то он не указывает на главное окно, также отсутствует его адрес!
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
16.06.2020, 17:15
Vulgar_Coder, раздевайтесь.... то есть код показывайте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2020, 17:15

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

Как закрыть окно MainWindow?
Здравствуйте У меня возникла следующая проблема: Не могу нормально удалить окно MainWindow. Функция close() вообще ничего ни...

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; class B{ public:

Как закрыть первое окно (MainWindow)?
Как закрыть первое окно (MainWindow) при открытии второго? private void Button_Click(object sender, RoutedEventArgs e) { ...

Главное окно программы
Как достать дескриптор главного окна программы зная только ид процесса(pid,dwProcessId).


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

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

Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru