2013-03-12 49 views
3

我已經在OSG郵件列表中發佈了這個,但郵件列表似乎有點慢。使用OSG的osgViewerQt示例Qt信號/插槽

無論如何,我試圖修改osgViewerQt example通過添加一個新的類我的 自己將包含查看器。設計是:

  • wrapper.h:定義類包裝。它從 的QMainWindow繼承和擁有 QDockWidget其中ViewerWidget附會。
  • viewer.h:定義ViewerWidget類。這是來自 例子的一個類,有幾個mod。
  • prueba_qt.cpp:主函數和創建QApplication的位置。一個包裝對象是 在這裏創建。

該項目編譯,但是當我執行它,我得到一個錯誤:

QWidget: Must construct a QApplication before a QPaintDevice* 

如果我刪除Q_OBJECT線,該信號包裝的插槽 .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的文件:

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_LEVELDEBUG_INFO並得到了this巨大的輸出。有錯誤的行是:

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

EDIT#2

的信號和時隙中的代碼失蹤。我剛將它們加到wrapper.h以及撥打Q_OBJECT

回答

2

經過一陣小睡後,我再次修改了項目中使用的庫。問題是這些庫中的一些處於調試模式,一些處於釋放模式。當使用信號和插槽時,moc變得瘋狂。

構建OSG調試庫後,我再次嘗試我的小例子,並工作。

這樣就完成了!