QGraphicsScene / QGraphicsView不呈现QGraphicsProxyWidget的osgEarth的QGLWidget(osgEarth :: ViewerWidget)

时间:2018-10-09 21:43:54

标签: c++ qt opengl qgraphicsview qgraphicsscene

我目前已经制作了一个自定义窗口系统,该系统可以在其中嵌入任何类型的小部件,并拖动/调整窗口及其内容的大小。本质上,我有一个不可见的(将样式表设置为不透明)小部件,它充当窗口的边缘以调整事件的大小,而标题栏则具有一些标题文本和按钮(最小化,最大化和关闭),以进行拖动事件。这样做的目的是因为我想使用QGraphicsScene来维护我可以创建的所有“窗口”,就像MDI系统一样,但与操作系统无关。标题栏下方是另一个子窗口小部件,从本质上来说,它只是osgEarth::ViewerWidget的父窗口,其技术上的类型为QGLWidget

现在,我知道我已经在QGraphicsView / QGraphicsScene之外正确实现了此功能,因为我可以看到osgEarth小部件并与其进行交互,并在桌面上移动窗口并调整大小,如果我只显示常规窗口。但是,当我将整个窗口系统转换为QGraphicsProxyWidget作为项目添加到QGraphicsScene的那一刻,它似乎不仅渲染QGraphicsScene中的osgEarth :: ViewerWidget,甚至如果我将视口设置为使用QGLWidget。如果添加其他内容,例如另一个常规的QWidgetQPushButton,它将在QGraphicsScene内正确地设置动画和绘制并正确交互。我的问题如下:

  1. 是否可以在QGraphicsScene(参考文档:https://github.com/gwaldron/osgearth/blob/master/src/osgEarthQt/ViewerWidget.cpp)中呈现嵌入式osgEarth :: ViewerWidget
  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);

}

0 个答案:

没有答案