Wohlstand
@Wohlstand
Инженер-программист С++

Как реализовать двустороннюю связь между классами С++ MainWindow mdiSubWindow GraphicsScene?

Есть приложение MDI на базе MainWindow.
MainWindow содержит множество DockWidget-ов, внутри которых я разместил наборы инструментов и окно свойств для элементов.
Дочерние окна содержат в себе "левый" QWidget (который определял сам) с растянутым QGraphicsView на всю ширину и высоту виджета, занимая всё его пространство. Внутри этого же виджета я создаю объект класса QGraphicsScene, так же кастомный.

Задача:
кроме возможности обращаться из MainWindow непосредственно в сцену, чтобы например, прочитать данные из массива и изменить порядок и наборы инструментов в соответствии с содержимым документа из объектов (например, при переключении между дочерними окнами, это уже имеем). Но также обеспечить возможность "звонить" в MainWindow непосредственно из сцены, например, я выделил элемент, и хочу в панельке свойств, размещённой в MainWindow сразу отобразить его характеристики, либо по клику мыши на элемент, либо по команде контекстного меню.
  • Вопрос задан
  • 2700 просмотров
Решения вопроса 1
Wohlstand
@Wohlstand Автор вопроса
Инженер-программист С++
Всё, я решил задачу сам!
Делюсь с теми, кто задаётся тем же вопросом:

Для этого я использовал метод "внешний указатель" для обеспечение обратной связи сцены в MainWindow.

Спасибо за подсказку одному моему австрийскому другу.

1) создаём статический указатель (на всякий случай, я запаковал его внутрь класса)
class MainWinConnect
{
public:
    static MainWindow * pMainWin;
};

и где-нибудь создаём тело для этого же указателя:
MainWindow * MainWinConnect::pMainWin;

2) В конструкторе нашего класса MainWindow просто записываем адрес самого себя прямо в наш указатель:
MainWinConnect::pMainWin = this;

3) Теперь стало возможным обращаться к функциям MainWindow практически из любого места, даже если объект класса MyScene создан непосредственно внутри самого MainWindow.
class MainWindow
{
   public:
      void callMe(int someData);
     ...
   MyScene * scene;
}

void MyScene::doSomething()
{
       ...
       MainWinConnect::pMainWin->callMe(1234);
       ...
}


Недостаток метода: подходит для классов-одиночек, поэтому любые обратные обращения лучше выполнять через сигналы-слоты, либо размещать все важные указатели прямо в классе-дочке
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы