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

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

    Для этого я использовал метод "внешний указатель" для обеспечение обратной связи сцены в 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);
           ...
    }
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы