QGraphicsScene / QGraphicsView не отображает QGraphicsProxyWidget в QGLWidget osgEarth QGLWarth (osgEarth :: ViewerWidget) - PullRequest
0 голосов
/ 10 октября 2018

В настоящее время я создал собственную оконную систему, которая может вставлять в нее виджеты любого типа и перетаскивать / изменять размеры окна и его содержимого.По сути, у меня есть невидимый виджет (для таблицы стилей он должен быть прозрачным), который действует как края окна для изменения размера событий, и строка заголовка с текстом заголовка и кнопками (свернуть, развернуть и закрыть) для событий перетаскивания.Цель этого состояла в том, что я хотел использовать QGraphicsScene для поддержки всех «окон», которые я могу сделать, что-то вроде системы MDI, но стиль, независимый от ОС.Ниже строки заголовка находится еще один дочерний виджет, который по сути является просто родителем для osgEarth::ViewerWidget, который технически имеет тип QGLWidget.

Теперь я знаю, что правильно реализовал это за пределами QGraphicsView / QGraphicsScene, потому что я могу видеть виджет osgEarth, взаимодействовать с ним, перемещать окна на рабочем столе и изменять размер всего, если япросто покажи обычное окно.Однако в тот момент, когда я преобразую всю оконную систему в QGraphicsProxyWidget для добавления к QGraphicsScene в качестве элемента, она, по-видимому, не отображает только osgEarth :: ViewerWidget в QGraphicsScene, даже если я установил область просмотра наиспользуйте QGLWidget.Если я добавлю что-нибудь еще, например, обычный QWidget или QPushButton, он будет правильно анимироваться, рисовать и правильно взаимодействовать в QGraphicsScene.Мои вопросы следующие:

  1. Возможно ли отобразить встроенный osgEarth :: ViewerWidget в QGraphicsScene (справочный документ: https://github.com/gwaldron/osgearth/blob/master/src/osgEarthQt/ViewerWidget.cpp)
  2. Если это возможно, чтошаги, которые я должен выполнить и в каком порядке выполнить то, что я хочу?
  3. Если это невозможно, есть ли альтернатива, использующая мою оконную систему для хранения всех окон?

Я искал кучу ресурсов, и многие из них, кажется, имеют немного отличающиеся проблемы, которые не решают мою проблему напрямую из того, что я тестировал.

Вот некоторый соответствующий код, чтобы лучше понять процесс, который яВ настоящее время есть:

void ViewerDock::addItem(QString itemName){
    std::string stdFileName = QDir::currentPath().toStdString() + "/earthfiles/demo.earth";
    char * earthFileNameCstr = new char[stdFileName.length() + 1];
    std::strcpy(earthFileNameCstr, stdFileName.c_str());
    char ** arguments = new char*[stdFileName.length() + 1];

    //Argument parser in viewer constructor needs argv[0] to be something
    char * programNameCstr = new char[18];
    std::string programNameStr = "./testViewers";
    std::strcpy(programNameCstr, programNameStr.c_str());
    arguments[0] = programNameCstr;
    arguments[1] = earthFileNameCstr;

    //Need it for node setup to give to the view adapter, myViewer extends osgEarth::ViewerWidget
    myViewer* mapViewer = new myViewer(2, arguments);
    osg::Node* node = mapViewer->m_mapNode->asNode();

    //This is my whole "window" I referred to
    QPointer<ViewerItem> dockWindow = new ViewerItem(itemName);

    //The child is the area of content to display below the titlebar
    dockWindow->setChildView(node, mapViewer);

    //Don't worry about this, this controls drawing stuff on the earth
    mission3dViewDriver = new Mission3dViewDriver(dockWindow->childView->mission3dView);

    dockWindow->resize(250,250);

    //Don't worry about this
    QPointer<DockButton> dockButton = new DockButton(itemName, dockWindow);
    dockWindows.push_back(dockWindow);
    dockButtons.push_back(dockButton);

    //The proxy that will convert the entire "window" into a QGraphicsItem
    QPointer<QGraphicsProxyWidget> dockProxy = new QGraphicsProxyWidget;

    //When showing normally, not within the scene or view, it looks correct
    //dockWindow->show();

    dockProxy->setWidget(dockWindow);

    //This is when it doesn't work
    scene->addItem(dockProxy);

    this->addWidget(dockButton);

}
...