//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. Tomcat配置Manager管理员

    修改文件: D:\MyDev\Tomcat\apache-tomcat-7.0.68\conf\tomcat-users.xml  配置内容: <role rolename="mana ...

  2. MMU工作原理(转)

    源: MMU工作原理

  3. apache编译安装php后需要注意以下配置

    安装后, 编辑apache配置文件 vi /usr/local/apache2/conf/httpd.conf 可以看到 LoadModule php7_module modules/libphp7. ...

  4. MySQL修改库名的方法

    先创建新的库,再用RENAME TABLE 语句移动旧库中的表到新库,最后删除旧库. (root@localhost) [(none)] create database mydb_2; Query O ...

  5. oracle exadata一体机虚拟机

    14年参加partner培训的时候,拿了份oracle exadata一体机虚拟机,有兴趣的可以试试,不过比较大,压缩后10GB,解压后50GB,启动后直接可用,2RAC节点+1存储节点,环境最好内存 ...

  6. GitHub客户端使用

    GitHub客户端使用 我们今天先讲解一下Github for windows(客户端)的使用方法,之后我们会以一个实例一步一步的来讲解Github. Github for windows(客户端)是 ...

  7. VR AR MR

    VR.AR和MR的区别? VR就是创造一个完全取代现实的世界,让人感觉「我怎么在这里?」 AR则是在现实世界的图像中叠加一些东西,让人感觉「哎?这里多了个本来不存在的东西」 MR则是虚拟物体完全和现实 ...

  8. k8s tensorflow

    Online learning github source Kubeflow实战系列 Prepare 了解ksonnet初探Google之Kubeflow (采用的是0.8.0)install dep ...

  9. mint-ui之Swipe使用

    <template> <div> <div class="swipe-wrapper"> <mt-swipe :auto="10 ...

  10. noip 2013 提高组 day1

    1.转圈游戏: 解析部分略,快速幂就可以过 Code: #include<iostream> #include<fstream> using namespace std; if ...