В настоящее время я создал собственную оконную систему, которая может вставлять в нее виджеты любого типа и перетаскивать / изменять размеры окна и его содержимого.По сути, у меня есть невидимый виджет (для таблицы стилей он должен быть прозрачным), который действует как края окна для изменения размера событий, и строка заголовка с текстом заголовка и кнопками (свернуть, развернуть и закрыть) для событий перетаскивания.Цель этого состояла в том, что я хотел использовать QGraphicsScene
для поддержки всех «окон», которые я могу сделать, что-то вроде системы MDI, но стиль, независимый от ОС.Ниже строки заголовка находится еще один дочерний виджет, который по сути является просто родителем для osgEarth::ViewerWidget
, который технически имеет тип QGLWidget
.
Теперь я знаю, что правильно реализовал это за пределами QGraphicsView
/ QGraphicsScene
, потому что я могу видеть виджет osgEarth, взаимодействовать с ним, перемещать окна на рабочем столе и изменять размер всего, если япросто покажи обычное окно.Однако в тот момент, когда я преобразую всю оконную систему в QGraphicsProxyWidget
для добавления к QGraphicsScene
в качестве элемента, она, по-видимому, не отображает только osgEarth :: ViewerWidget в QGraphicsScene
, даже если я установил область просмотра наиспользуйте QGLWidget
.Если я добавлю что-нибудь еще, например, обычный QWidget
или QPushButton
, он будет правильно анимироваться, рисовать и правильно взаимодействовать в QGraphicsScene
.Мои вопросы следующие:
- Возможно ли отобразить встроенный osgEarth :: ViewerWidget в
QGraphicsScene
(справочный документ: https://github.com/gwaldron/osgearth/blob/master/src/osgEarthQt/ViewerWidget.cpp) - Если это возможно, чтошаги, которые я должен выполнить и в каком порядке выполнить то, что я хочу?
- Если это невозможно, есть ли альтернатива, использующая мою оконную систему для хранения всех окон?
Я искал кучу ресурсов, и многие из них, кажется, имеют немного отличающиеся проблемы, которые не решают мою проблему напрямую из того, что я тестировал.
Вот некоторый соответствующий код, чтобы лучше понять процесс, который яВ настоящее время есть:
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);
}