我目前已经制作了一个自定义窗口系统,该系统可以在其中嵌入任何类型的小部件,并拖动/调整窗口及其内容的大小。本质上,我有一个不可见的(将样式表设置为不透明)小部件,它充当窗口的边缘以调整事件的大小,而标题栏则具有一些标题文本和按钮(最小化,最大化和关闭),以进行拖动事件。这样做的目的是因为我想使用QGraphicsScene
来维护我可以创建的所有“窗口”,就像MDI系统一样,但与操作系统无关。标题栏下方是另一个子窗口小部件,从本质上来说,它只是osgEarth::ViewerWidget
的父窗口,其技术上的类型为QGLWidget
。
现在,我知道我已经在QGraphicsView
/ QGraphicsScene
之外正确实现了此功能,因为我可以看到osgEarth小部件并与其进行交互,并在桌面上移动窗口并调整大小,如果我只显示常规窗口。但是,当我将整个窗口系统转换为QGraphicsProxyWidget
作为项目添加到QGraphicsScene
的那一刻,它似乎不仅渲染QGraphicsScene
中的osgEarth :: ViewerWidget,甚至如果我将视口设置为使用QGLWidget
。如果添加其他内容,例如另一个常规的QWidget
或QPushButton
,它将在QGraphicsScene
内正确地设置动画和绘制并正确交互。我的问题如下:
QGraphicsScene
(参考文档:https://github.com/gwaldron/osgearth/blob/master/src/osgEarthQt/ViewerWidget.cpp)中呈现嵌入式osgEarth :: ViewerWidget 我搜索了很多资源,其中许多似乎有一些略有不同的问题,这些问题无法根据我的测试直接解决我的问题。
这里有一些相关的代码可以更好地理解我目前的流程:
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);
}