//main.cpp

#include "VREObliqueEditorQTWindow.h"
#include <QtWidgets/QApplication>
#include <QTextCodec>
#include <QFileInfo> int main(int argc, char *argv[])
{
QTextCodec *xcodec = QTextCodec::codecForLocale();
QString exeDir = xcodec->toUnicode(QByteArray(argv[]));
QString BKE_CURRENT_DIR = QFileInfo(exeDir).path();
QStringList libpath;
libpath << BKE_CURRENT_DIR + QString::fromLocal8Bit("/plugins/platforms");
libpath << BKE_CURRENT_DIR << BKE_CURRENT_DIR + QString::fromLocal8Bit("/plugins/imageformats");
libpath << BKE_CURRENT_DIR + QString::fromLocal8Bit("/plugins");
libpath << QApplication::libraryPaths();
QApplication::setLibraryPaths(libpath);
////以上是跑qt的环境变量 QApplication a(argc, argv); VREObliqueEditor* mw = new VREObliqueEditor();
mw->init();
mw->show(); a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
return a.exec();
}

主函数仅仅是QT的调用

#pragma once
//VREObliqueEditorQTWindow.h #include <QtWidgets/QMainWindow>
#include "ui_VREObliqueEditor.h" class ViewerQT;
class VREObliqueEditor : public QMainWindow
{
Q_OBJECT public:
VREObliqueEditor(QWidget *parent = Q_NULLPTR);
void init();
private:
Ui::VREObliqueEditorClass ui; ViewerQT * m_viewer; void OSGInit();
};

QT主窗口头文件

//VREObliqueEditorQTWindow.cpp
#include "VREObliqueEditorQTWindow.h" #include "VREOSGWidget.h" VREObliqueEditor::VREObliqueEditor(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_viewer = new ViewerQT;
} void VREObliqueEditor::init()
{
OSGInit();
showMaximized();
setCentralWidget(m_viewer);
} void VREObliqueEditor::OSGInit()
{ osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("cow.osg");
m_viewer->setCameraManipulator(new osgGA::TrackballManipulator);
m_viewer->setSceneData(loadedModel.get()); m_viewer->addEventHandler(new osgViewer::StatsHandler());
m_viewer->addEventHandler(new osgViewer::WindowSizeHandler()); }

QT主窗口头文件

#pragma once
//VREOSGWidget.h #include <osg/ArgumentParser>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator> #include <osgDB/ReadFile>
#include <QtCore/QString>
#include <QtCore/QTimer>
#include <QtGui/QKeyEvent>
#include <QtOpenGL/QGLWidget>
#include <iostream> using Qt::WindowFlags; class AdapterWidget :public QGLWidget
{
public:
AdapterWidget(QWidget *parent = , const char* name = , const QGLWidget * shareWidget = , WindowFlags f = ); virtual ~AdapterWidget()
{ } osgViewer::GraphicsWindow* getGraphicsWindow()
{
return _gw.get();
} const osgViewer::GraphicsWindow* getGraphicsWidow()const
{
return _gw.get();
}
protected:
virtual void resizeGL(int width, int height);
virtual void keyPressEvent(QKeyEvent* event);
virtual void keyReleaseEvent(QKeyEvent* event);
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);//
virtual void mouseMoveEvent(QMouseEvent* event); osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _gw; }; class ViewerQT : public osgViewer::Viewer, public AdapterWidget
{
public:
ViewerQT(QWidget * parent = , const char * name = , const QGLWidget * shareWidget = , WindowFlags f = ) :AdapterWidget(parent, name, shareWidget, f)
{
getCamera()->setViewport(new osg::Viewport(, , width(), height()));
getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width()) / static_cast<double>(height()), 1.0f, 10000.0f);
getCamera()->setGraphicsContext(getGraphicsWindow()); setThreadingModel(osgViewer::Viewer::SingleThreaded);
connect(&_timer, SIGNAL(timeout()), this, SLOT(updateGL()));//并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。 _timer.start();//使用start()来开始 } virtual void paintGL()
{
frame();
}
protected:
QTimer _timer;
};

osg窗口源文件

#include "VREOSGWidget.h"
//VREOSGWidget.cpp AdapterWidget::AdapterWidget(QWidget *parent, const char* name, const QGLWidget * shareWidget, WindowFlags f) :QGLWidget(parent, shareWidget, f)
{
_gw = new osgViewer::GraphicsWindowEmbedded(, , width(), height());
setFocusPolicy(Qt::ClickFocus);
} void AdapterWidget::resizeGL(int width, int height)
{
_gw->getEventQueue()->windowResize(, , width, height);
_gw->resized(, , width, height); }
void AdapterWidget::keyPressEvent(QKeyEvent* event)
{
_gw->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol)*(event->text().toLatin1().data()));
} void AdapterWidget::keyReleaseEvent(QKeyEvent* event)
{
int keyAscii = (osgGA::GUIEventAdapter::KeySymbol)*(event->text().toLatin1().data());
_gw->getEventQueue()->keyRelease(keyAscii);
//if (keyAscii == 27)
// quit();
} void AdapterWidget::mousePressEvent(QMouseEvent* event)
{
int button = ;
switch (event->button())
{
case(Qt::LeftButton):
button = ;
break;
case (Qt::MidButton):
button = ;
break;
case (Qt::RightButton):
button = ;
break;
case (Qt::NoButton):
button = ;
break;
default:
button = ;
break;
} _gw->getEventQueue()->mouseButtonPress(event->x(), event->y(), button); } void AdapterWidget::mouseReleaseEvent(QMouseEvent* event)
{
int button = ;
switch (event->button())
{
case(Qt::LeftButton):
button = ;
break;
case(Qt::MidButton):
button = ;
break;
case(Qt::RightButton):
button = ;
break;
case(Qt::NoButton):
button = ;
break;
default:
button = ;
break;
}
_gw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
} void AdapterWidget::mouseMoveEvent(QMouseEvent* event)
{
_gw->getEventQueue()->mouseMotion(event->x(), event->y()); }

osg窗口源文件

一个简单osg与QT窗口的结合

需要开发QT窗口控件,就在"ui_VREObliqueEditor.h"上与“QT主窗口”做文章

需要开发OSG则正常开发

[原][osg][QT]osg与QT界面结合的简单例子二的更多相关文章

  1. [转][osg][QT]osg与QT界面结合的简单例子

    //QT += core gui opengl //LIBS += -losgViewer -losgDB -losgUtil -losg -lOpenThreads -losgGA -losgQt ...

  2. Robot Framework与Web界面自动化测试:简单例子

    假设环境已经搭建好了.这里用RIDE( Robot Framework Test Data Editor)工具来编写用例.下面我们对Robot Framework简称rf. 我们先考虑下一个最基本的登 ...

  3. Qt osg QWidget osgViewer::Viewer

    osgViewer::Viewer* _viewer = nullptr; _viewer = new osgViewer::Viewer;osg::ref_ptr<osg::Group> ...

  4. QT 基于QScrollArea的界面嵌套移动

    在实际的应用场景中,经常会出现软件界面战场图大于实际窗体大小,利用QScrollArea可以为widget窗体添加滚动条,可以实现小窗体利用滚动条显示大界面需求.实现如下: QT创建一个qWidget ...

  5. 用Qt写软件系列三:一个简单的系统工具之界面美化

    前言 在上一篇中,我们基本上完成了主要功能的实现,剩下的一些导出.进程子模块信息等功能,留到后面再来慢慢实现.这一篇来讲述如何对主界面进行个性化的定制.Qt库提供的只是最基本的组件功能,使用这些组件开 ...

  6. qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新

    qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新 Widget wit ...

  7. Qt 地址薄 (一) 界面设计

    实现一个简单的地址薄,功能包括:地址的添加.浏览.编辑.查找.输出文件等. 1  界面和元素 整个地址薄界面,可视为一个 AddressBook 类.其中的 Name.Address 以及两个编辑栏, ...

  8. qml(Qt Quick)做界面

    qml(Qt Quick)做界面 来源  https://www.zhihu.com/question/24880681/answer/29324824 本人是Qt初学者,正在写一个会计小软件(Lin ...

  9. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

随机推荐

  1. ES6知识整理(8)--Promise对象

    (关于promise,以前并不知道是什么,没这个概念.现在来学习总结下) promise含义 es6的异步编程解决方案.需要new新对象操作api. promise对象特点 有3中状态:pending ...

  2. HTMLCollection 对象和NodeList 对象

    获取html元素有三种方法,其中通过类名和标签获取的结果为一个HTMLCollection对象. HTMLCollection对象可以理解为一个包含html元素的数组(但不是数组),可以通过索引[ ] ...

  3. mysql导入导出表

    导入 source ***(路径+文件) 导出 mysqldump -uroot -plizhenghua 数据库名 表名 > 你要保存的sql文件(加位置)

  4. linux 计划任务 crontab 简单用法

    添加计划任务: 方法1: crontab -e 方法2: vim /etc/crontab #这种方式进去的文件有个sample可供参考 查看已经启动的任务:crontab -l 查看运行状态:ser ...

  5. 论证与测试 + 用EA画uml

    论证与测试,谁才是真正的不二法门 第十三次作业的时候,我们开始使用Junit对代码进行测试,主要是测试代码的覆盖率,以及分支的覆盖率.(主要是检查JSF写的是否是符合规范,……). 这里我给出我测试的 ...

  6. shelve模块,sys模块,logging模块

    1.shelve模块 用于序列化的模块,shelve模块比pickle模块简单,只有open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型. impor ...

  7. python --- 22 初始模块 random time collections functools

    一 .初始模块 1.从⼩到⼤的顺序: ⼀条代码 < 语句块 < 代码块(函数, 类) < 模块 2.引入模块的方式 ①   import   模块 ②   from   模块  im ...

  8. Newcoder 华华给月月出题(线筛)题解

    题目描述: 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7)) ⊕⊕符 ...

  9. 【做题】Codeforces Round #453 (Div. 1) D. Weighting a Tree——拆环

    前言:结论题似乎是我的硬伤…… 题意是给你一个无向图,已知连接到每一个点的边的权值和(为整数,且属于区间[-n,n]),需要求出每条边权值的一个合法解(都要是在区间[-2*n^2,2*n^2]内的整数 ...

  10. centos远程访问

    centos远程访问即windows下的mysql和linux下的mysql能连接,即windows下的navicat能连接到(访问)centos下的mysql中的库表 (centos是linux的一 ...