[原][osg][QT]osg与QT界面结合的简单例子二
//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界面结合的简单例子二的更多相关文章
- [转][osg][QT]osg与QT界面结合的简单例子
//QT += core gui opengl //LIBS += -losgViewer -losgDB -losgUtil -losg -lOpenThreads -losgGA -losgQt ...
- Robot Framework与Web界面自动化测试:简单例子
假设环境已经搭建好了.这里用RIDE( Robot Framework Test Data Editor)工具来编写用例.下面我们对Robot Framework简称rf. 我们先考虑下一个最基本的登 ...
- Qt osg QWidget osgViewer::Viewer
osgViewer::Viewer* _viewer = nullptr; _viewer = new osgViewer::Viewer;osg::ref_ptr<osg::Group> ...
- QT 基于QScrollArea的界面嵌套移动
在实际的应用场景中,经常会出现软件界面战场图大于实际窗体大小,利用QScrollArea可以为widget窗体添加滚动条,可以实现小窗体利用滚动条显示大界面需求.实现如下: QT创建一个qWidget ...
- 用Qt写软件系列三:一个简单的系统工具之界面美化
前言 在上一篇中,我们基本上完成了主要功能的实现,剩下的一些导出.进程子模块信息等功能,留到后面再来慢慢实现.这一篇来讲述如何对主界面进行个性化的定制.Qt库提供的只是最基本的组件功能,使用这些组件开 ...
- qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新
qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新 Widget wit ...
- Qt 地址薄 (一) 界面设计
实现一个简单的地址薄,功能包括:地址的添加.浏览.编辑.查找.输出文件等. 1 界面和元素 整个地址薄界面,可视为一个 AddressBook 类.其中的 Name.Address 以及两个编辑栏, ...
- qml(Qt Quick)做界面
qml(Qt Quick)做界面 来源 https://www.zhihu.com/question/24880681/answer/29324824 本人是Qt初学者,正在写一个会计小软件(Lin ...
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
随机推荐
- java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'waterQuality
如果一个项目中有两个@RequestMapping("/xxx")完全相同就会报 java.lang.IllegalStateException 改进办法:修改@RequestM ...
- PID控制器开发笔记(转)
源: PID控制器开发笔记
- pyqt5 树节点点击实现多窗口切换
# coding=utf-8 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui ...
- P4381 [IOI2008]Island(基环树+单调队列优化dp)
P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 ...
- Android开发发布真机调试
使用真机测试原因: 1. 模拟器启动慢,真机测试速度较快 2. 有些程序在真机测试才有效,模拟器存在bug,结果要以真机为标准 连接方法: 1.设置手机为开发者模式(设置->关于手机->连 ...
- UI自动化(二)css选择器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- PHP命名空间(Namespace)的使用简介
原文链接:https://www.cnblogs.com/zhouguowei/p/5200878.html 可以导入命名空间也可以导入命名空间的类 <?php namespace Blog\A ...
- 让InstallShield 2015 Limited Edition for Visual Studio 2015生成的setup.exe双击时以管理员权限运行
转载:http://blog.csdn.net/zztoll/article/details/52096700 如题,如何让InstallShield 2015 Limited Edition for ...
- CocoaPods出错
1 Error: pod search Masonry /usr/local/lib/ruby/gems/2.3.0/gems/cocoapods-1.4.0.beta.2/lib/cocoapods ...
- 终于记住回车和换行cr lf的来由和含义了 -参考: http://www.cnblogs.com/me115/archive/2011/04/27/2030762.html
回车: carriage return, 是将光标在同一行中, 回到当前行的 行首. 回来的本意就是 返回.. 所以 是同一行的行首. CR 换行: line feed: feed: 饲养(动物); ...