I just played around a bit and managed to get a very simple integration.
It is a bit cheating, I simply take an OSG window and add it to a Qt widget.
* No fancy Qt stuff supported like drag and drop, overdrawing etc.
* Only windows (although Linux should be no problem after some modifying)
* Multithreading not a problem here
* Should run with Qt 5.1 or newer
Code:
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/api/win32/GraphicsWindowWin32>
#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QTimer>
#include <QWidget>
#include <QWindow>
#include <assert.h>
int main(int argc, char** argv)
{
if (argc<2)
{
std::cout << argv[0] <<": requires filename argument." << std::endl;
return 1;
}
// Create Qt app
QApplication app( argc, argv );
// Create OSG Window
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
// setup viewer
{
viewer->setUpViewInWindow(0,0,800,600);
viewer->setCameraManipulator(new osgGA::TrackballManipulator);
viewer->setSceneData(osgDB::readNodeFile(argv[1]));
viewer->realize(); // else window does not show
}
QWidget* mainwidget = new QWidget;
mainwidget->setLayout(new QVBoxLayout());
mainwidget->resize(800,600);
mainwidget->show();
// Add osg window to main widget
{
osgViewer::ViewerBase::Windows wins;
viewer->getWindows(wins);
// Get native windows HWND window id from OSG window
osgViewer::GraphicsWindowWin32* osgwin =
dynamic_cast<osgViewer::GraphicsWindowWin32*>(wins.front());
assert(osgwin);
HWND winid = osgwin->getHWND();
// Create a QWindow from osg window id and place it in a widget
QWindow* qtwindow = QWindow::fromWinId((WId)winid);
QWidget* osgwidget = QWidget::createWindowContainer(qtwindow);
osgwidget->setMinimumSize(QSize(320,200));
// Add osg widget to a main widget
mainwidget->layout()->addWidget(osgwidget);
}
// Add a slider changing the background color
{
QSlider* slider = new QSlider(Qt::Horizontal, mainwidget);
slider->setRange(0, 255);
mainwidget->layout()->addWidget(slider);
// Connect to lambda
QObject::connect(slider, &QSlider::valueChanged, [=](int v) {
viewer->getCamera()->setClearColor(osg::Vec4((float)v / 256.0f, 0, 1, 1)); });
}
// Make Qt call osg tick
{
QTimer* timer = new QTimer(mainwidget);
timer->start(20);
QObject::connect(timer, &QTimer::timeout, [=]() { viewer->frame(); });
}
app.exec();
// clean up
viewer = nullptr;
delete mainwidget;
return 0;
}
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=58690#58690
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org