3

すでにOSGメーリングリストに投稿していますが、少し遅いようです。

とにかく、ビューアを含む独自の新しいクラスを追加して、 osgViewerQtの例を変更しようとしています。デザインは次のとおりです。

  • wrapper.h :クラスWrapperを定義します。QMainWindowから継承し 、ViewerWidgetが接続されるQDockWidgetを備えてい ます。
  • Viewer.hViewerWidgetクラスを定義します。これは例のクラスで、私がいくつかの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:SOは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ファイルしか解析できないため、シグナル/スロットメカニズムに1つ必要であると読んだためにのみ存在します。)

    #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_LEVELDEBUG_INFOに設定し、この巨大な出力を取得しました。エラーのある行は次のとおりです。

FindFileInPath() : trying C:\cygwin\bin\osgPlugQWidget: Must construct a QApplication before a QPaintDevice

編集#2

信号とスロットがコードにありませんでした。Q_OBJECTの呼び出しとともに、それらをwrapper.hに追加しました。

4

1 に答える 1

2

少しお昼寝した後、プロジェクトで使用されているライブラリを再度改訂しました。問題は、それらのライブラリの一部がデバッグモードであり、一部がリリースモードであったことでした。信号とスロットを使用するとき、moc夢中になりました。

デバッグライブラリを構築した後OSG、私は自分の小さな例を再試行して作業しました。

これで完了です。

于 2013-03-13T16:12:51.600 に答える