查看: 3316|回复: 9

osgQt安装的初级编译问题

[复制链接]

该用户从未签到

发表于 2013-1-23 16:26:32 | 显示全部楼层 |阅读模式
本帖最后由 tegger 于 2013-1-23 16:47 编辑

刚学osg,下载了OpenSceneGraph-3.0.1-VS9.0.30729-x86-release binary版.想与qt合成,但是里面不包含OsgQt于是下载了源码放在QtCreator中编译,出现以下错误
QWidgetImage.obj : error LNK2019: 无法解析的外部符号 "public: static struct QMetaObject const osgQt:GraphicsViewAdapter::staticMetaObject" (?staticMetaObject@QGraphicsViewAdapter@osgQt@@2UQMetaObject@@B),该符号在函数 "public: static class QString __cdecl osgQt::QGraphicsViewAdapter::tr(char const *,char const *)" (?tr@QGraphicsViewAdapter@osgQt@@SA?AVQString@@PBD0@Z) 中被引用
QGraphicsViewAdapter.obj : error LNK2001: 无法解析的外部符号 "public: static struct QMetaObject const osgQt::QGraphicsViewAdapter::staticMetaObject" (?staticMetaObject@QGraphicsViewAdapter@osgQt@@2UQMetaObject@@B)
QGraphicsViewAdapter.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall osgQt::QGraphicsViewAdapter::metaObject(void)const " (?metaObject@QGraphicsViewAdapter@osgQt@@UBEPBUQMetaObject@@XZ)
QGraphicsViewAdapter.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall osgQt::QGraphicsViewAdapter::qt_metacast(char const *)" (?qt_metacast@QGraphicsViewAdapter@osgQt@@UAEPAXPBD@Z)
QGraphicsViewAdapter.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall osgQt::QGraphicsViewAdapter::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@QGraphicsViewAdapter@osgQt@@UAEHW4Call@QMetaObject@@HPAPAX@Z)


class OSGQT_EXPORT QGraphicsViewAdapter : public QObject
{
  Q_OBJECT
    public:
变为
class OSGQT_EXPORT QGraphicsViewAdapter : public QObject
{
    public:
也就是去掉了 Q_OBJECT
编译可以通过。运行osgviewerQt 可以运行但是什么都不显示,而且觉得很卡。osgBrowser例子运行不出现浏览器,只有一个黑板,可以拖动,是不是Q_OBJECT去掉的问题。试了两个版本QT4.7.1,4.8.4,都一样 搞晕了
在qt下怎么才能正常跑起来?请大家帮帮忙

该用户从未签到

发表于 2013-1-23 16:31:46 | 显示全部楼层
CMake 找到了qt 的Qmake了?

该用户从未签到

 楼主| 发表于 2013-1-23 16:45:45 | 显示全部楼层
本帖最后由 tegger 于 2013-1-23 16:48 编辑

我没用到cmake就是直接在qtcreator建个dll工程把那个几个源文件加入然后进行编译
正常情况下应该怎么编译osg for qt               windows下的

该用户从未签到

 楼主| 发表于 2013-1-23 21:54:35 | 显示全部楼层
感谢liuzhiyu123 ,好了,本来还想省事用现成编译好的,原来非得自已设置一个QTDIR重新编译就可以了,看看懒还真的不行呀。浪费这么多时间。

该用户从未签到

发表于 2013-1-24 07:40:21 | 显示全部楼层
不用设置也行啊。只要是能找到QMake就行了 其他的它会根据QMake的路径自己搜索

该用户从未签到

 楼主| 发表于 2013-1-24 13:00:14 | 显示全部楼层
还得请教个问题。
#ifndef QOSGWIDGET_H_
#define QOSGWIDGET_H_

#include <osgQt/GraphicsWindowQt>
#include <osgViewer/Viewer>
#include <QtCore/QTimer>

class QOsgWidget : public osgQt::GLWidget, public osgViewer::Viewer
{
public:
  QOsgWidget(QWidget* parent = NULL);
#if 0 // For ON_DEMAND debugging
  virtual void frame(double simulationTime);
#endif

protected:
  ~QOsgWidget();

  void setupContext();
};

#endif
///CPP
#include "QOsgWidget.h"
#include <QDebug>

#include <osgGA/TrackballManipulator>
#include <osgViewer/ViewerEventHandlers>

QOsgWidget:OsgWidget(QWidget* parent) : osgQt::GLWidget(parent)
{
  setupContext();
  this->addEventHandler(new osgViewer::StatsHandler);
  this->setCameraManipulator(new osgGA::TrackballManipulator);

  // Before calling setViewer(), this object needs to have a reference count of > 0
  this->ref();
  osgQt::setViewer(this);
}

QOsgWidget::~QOsgWidget()
{
  this->unref();
}

void QOsgWidget::setupContext()
{
  osg:isplaySettings *ds = osg::DisplaySettings::instance().get();
  osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits(ds);
  traits->x = this->x();
  traits->y = this->y();
  traits->width = this->width();
  traits->height = this->height();
  traits->doubleBuffer = true;
  traits->inheritedWindowData = new osgQt::GraphicsWindowQt::WindowData(this);
  
  // This requires Qt to be the main window system while building OSG:
  //  osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  // This should work independent of how OSG was built:
  osg::ref_ptr<osgQt::GraphicsWindowQt> gw = new osgQt::GraphicsWindowQt(traits.get());

  getCamera()->setGraphicsContext(gw.get());
  getCamera()->setViewport(traits->x, traits->y, traits->width, traits->height);
  getCamera()->setProjectionMatrixAsPerspective(30.0f, 1.0f*traits->width/traits->height, 1.0f, 10000.0f);
  gw->getEventQueue()->getCurrentEventState()->setWindowRectangle(traits->x, traits->y, traits->width, traits->height);

  // FIXME: Is this necessary?
  // GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
  // _camera->setDrawBuffer(buffer);
  // _camera->setReadBuffer(buffer);
}

#if 0 // For ON_DEMAND debugging
void QOsgWidget::frame(double simulationTime)
{
  qDebug() << "QOsgWidget::frame()";
  osgViewer::ViewerBase::frame(simulationTime);
}
#endif
一到 osg::ref_ptr<osgQt::GraphicsWindowQt> gw = new osgQt::GraphicsWindowQt(traits.get());
就异常了,不知道是什么原因 这个是网上下载的例子。

该用户从未签到

发表于 2013-1-28 09:29:01 | 显示全部楼层
为什么您不直接用osgviewerQt例子来进行试验

该用户从未签到

 楼主| 发表于 2013-1-28 16:52:24 | 显示全部楼层
osgviewerQt可以运行,但是模型显了不了,全空。用绝对路径也不行。
osgQtWidgets 这个例子能显示模型及qt的窗口,但是也是有问题,操作几下内部窗口就出错,内部窗口的只能双击,,而且全屏退出也不正常不能正常退出,要按任务管理器才能退出。
osgQtBrowser 也是一样能显示,就是退出问题,
看来对qt的支持只能处在实验的阶段。
本人一直用QT,特想让它与qt结合,结果问题这么多.

该用户从未签到

发表于 2013-1-29 09:53:07 | 显示全部楼层
osgViewerQt 是没有问题的,检查路径和不要带中文

该用户从未签到

发表于 2013-1-31 09:58:52 | 显示全部楼层
您最后下了一个毫无根据的结论,我的大部分项目目前都是用OSG结合Qt来完成的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表