如何将 osgEarth 的 ViewerWidget 放入选项卡式 MdiArea?

Posted

技术标签:

【中文标题】如何将 osgEarth 的 ViewerWidget 放入选项卡式 MdiArea?【英文标题】:How to put osgEarth's ViewerWidget into an tabbed MdiArea? 【发布时间】:2013-07-21 16:58:05 【问题描述】:

将 osgEarth 的 ViewerViewer 放入 QMdiArea 有什么特别之处吗?我创建了一个QMdiArea 作为中心小部件(称为setCentralWidget),而不是直接将osgEarth 的查看器作为中心小部件。

QMdiArea *mdiArea = new QMdiArea(this); 
setCentralWidget(mdiArea); // call to QMainWindows method, snippet is taken from app's MainWindow 
mdiArea->addSubWindow(viewerWidget); // this doesn't work, globe is not drawn

我尝试的一切都没有奏效...除了 osgEarth 的 ViewerWidget 被设置为我的 MainWindow 的中心小部件。还尝试了MultiViewerWidget,但没有任何成功,但因为我只需要一个视图,ViewerWidget 应该可以,还是不行?

我查看了示例,但没有成功使用其中一个作为起点。

有什么提示吗?提前致谢。

【问题讨论】:

osgEearth 使用 OpenGL 对吗?如果我没记错的话,QMdiArea 与 OpenGL 小部件存在一些问题。不要相信我的话,因为我可能是错的。 【参考方案1】:

你可以试试这个,Form1QDialog

在 main.cpp 中

int main()

    QApplication a(argc, argv);
    Form1 w=new Form1();//qdialog
    .................//do something to initial the map
    w.loadWidget(viewerWidget);
    w.show();//the order of the loadwiget() and show() is important!!!!!
    a.exec(); 

在 Form1.cpp 中

void Form1::loadWidget(QWidget *qwidget)

    qwidget->setMinimumSize( ui.mdiArea->width(),ui.mdiArea->height());
    QMdiSubWindow * subW=ui.mdiArea->addSubWindow(qwidget);
    subW->setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint);
    subW->maximumSize();

这适用于qt 4.8.4+osgearth 2.3

【讨论】:

【参考方案2】:

尝试在启动 UI 之前设置子窗口的几何图形。

   QMdiSubWindow* sw = mdiArea->addSubWindow(viewerWidget); 
   sw->setGeometry(...); 

否则OSG可能会变得混乱。

Gwaldron 在 osgEarth 论坛 here 上得到了这个答案,它奏效了。

同时设置 viewerWidget 的最小尺寸也会有所帮助(例如,用于在 TabWidget 上定位)。看我的问答here。

【讨论】:

您好 Thomas,我是 osgearth 和 qt 的新手。我想创建一个 qt 应用程序并在主窗口中显示 osgearth 视图,但我不能!我的问题是 qt 窗口和 osgearth 窗口之间的集成。你能帮帮我吗?

以上是关于如何将 osgEarth 的 ViewerWidget 放入选项卡式 MdiArea?的主要内容,如果未能解决你的问题,请参考以下文章

[原][译]关于osgEarth::VirtualProgram

[原][译]关于osgEarth::VirtualProgram

如何使用tortoisegit查看osgearth例子代码

osgearth 只移动

osgearth反应慢

osgEarth的Rex引擎原理分析(一二三)osgEarth的缓存及其结构