将OSG的osgViewerQt示例与Qt信号/插槽一起使用

Using OSG's osgViewerQt example with Qt signals/slots

本文关键字:信号 插槽 一起 Qt OSG osgViewerQt      更新时间:2023-10-16

我已经在OSG邮件列表中发布了这个,但是邮件列表似乎有点慢。

无论如何,我试图通过添加一个新的类来修改osgViewerQt的例子将包含查看器。设计如下:

  • Wrapper .h:定义类Wrapper。它继承自QMainWindow有一个QDockWidget,其中 viewwidget 将被附加。
  • viewer.h:定义ViewerWidget类。这是来自例如,我有几个mod。
  • prueba_qt.cpp:主函数和创建QApplication的地方。包装器对象是这里创建的。

项目编译,但是当我执行它时,我得到一个错误:

QWidget: Must construct a QApplication before a QPaintDevice*

如果我删除Q_OBJECT行,信号插槽wrapper.h并使用

从终端编译文件
g++ -IE:/osg-3.0.1/install/include -LE:/osg-3.0.1/install/bin -IC:/Qt64/4.8/include -LC:/Qt64/4.8/bin -losgViewer -lOpenThreads -losgDB -losg -losgGA -losgQt -lQtCore4 -lQtGui4 prueba_qt.cpp

我可以执行应用程序。

你能告诉我我该怎么做吗?我一直在挣扎早上好,但找不到解决办法。

谢谢你的时间!

PS:所以Windows 7 64位# MingW编译器# Qt 4.8 # OSG 3.0.1

PS2:以下是我在这个项目中使用的文件,包括qmake:

中的pro文件

wrapper.h

    #ifndef Wrapper_hpp
    #define Wrapper_hpp
    #include "viewer.h"
    #include <QtGui/QMainWindow>
    #include <QtGui/QDockWidget>
    class Wrapper: public QMainWindow {
     Q_OBJECT
    private:
      ViewerWidget* view;
      QDockWidget* dock;
    public:
      Wrapper(void) {
        view = new ViewerWidget();
        dock = new QDockWidget;
        dock->setWidget( view );
        dock->setGeometry( 100, 100, 800, 600 );
        dock->setAllowedAreas(Qt::RightDockWidgetArea);
        addDockWidget(Qt::RightDockWidgetArea, dock);
        dock->show();
      }
      void Do(void) { view->Do(); }
      void Add(void) { view->Add(); }
      virtual ~Wrapper(void) {}
      public slots:
        void MySlot(void) {}
      signals:
        void MySignal(void);
    };
    #endif

wrapper.cpp

(这只是因为我在Qt论坛上读到moc只能解析cpp文件,因此信号/插槽机制需要一个。)

    #include "wrapper.h"
    Wrapper::Wrapper(void) {
        view = new ViewerWidget();
    //    view->setGeometry( 100, 100, 800, 600 );
        dock = new QDockWidget;
        dock->setWidget( view );
        dock->setGeometry( 100, 100, 800, 600 );
        dock->setAllowedAreas(Qt::RightDockWidgetArea);
        addDockWidget(Qt::RightDockWidgetArea, dock);
        dock->show();
    }

prueba_qt.cpp

#include <QtGui/QApplication>
#include <iostream>
#include "wrapper.h"
int main( int argc, char** argv ) {
    osg::ArgumentParser arguments(&argc, argv);
    QApplication app(argc, argv);
    Wrapper wrap;
    wrap.resize(800,600);
    wrap.setWindowTitle("Cow");
    wrap.showNormal();
    wrap.Do();    
    return app.exec();
}

prueba_qt.pro

    ######################################################################
    # Automatically generated by qmake (2.01a) mar 12. mar 13:45:28 2013
    ######################################################################
    QT += core gui
    TEMPLATE = app
    TARGET = 
    DEPENDPATH += .
    INCLUDEPATH += . E:/osg-3.0.1/install/include
    LIBS += -LE:/osg-3.0.1/install/bin -losg -lOpenThreads -losgDB -losgGA -losgQt -losgViewer
    # Input
    HEADERS += viewer.h wrapper.h
    SOURCES += prueba_qt.cpp wrapper.cpp

viewer.h:这是相当大的,所以我把它上传到pastebin

编辑# 1

我将OSG_NOTIFY_LEVEL设置为DEBUG_INFO并得到了这个巨大的输出。出现错误的那行是:

FindFileInPath() : trying C:cygwinbinosgPlugQWidget: Must construct a QApplication before a QPaintDevice

编辑# 2

代码中缺少信号和槽。我只是将它们添加到wrapper.h以及对Q_OBJECT的调用。

小睡片刻后,我再次修改了项目中使用的库。问题是其中一些库处于调试模式,而另一些处于发布模式。当使用信号和插槽时,moc发疯了。

在构建了OSG调试库之后,我再次尝试了我的小示例并成功了。

所以它完成了!