Используя пример OSG osgViewerQt с сигналами / слотами Qt

Я уже разместил это в списке рассылки OSG, но список рассылки кажется немного медленным.

Во всяком случае, я пытаюсь изменить Пример osgViewerQt добавив новый класс моего
собственный, который будет содержать зрителя. Дизайн:

  • wrapper.h: Определяет класс обертка. Наследуется от
    QMainWindow и имеет
    QDockWidget где ViewerWidget будет прикреплен
  • viewer.h: Определяет ViewerWidget учебный класс. Это класс из
    Например, с несколькими модами от меня.
  • prueba_qt.cpp: Основная функция и где создается QApplication. Объект Wrapper
    создано здесь.

Проект компилируется, но когда я его выполняю, я получаю сообщение об ошибке:

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:

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:\cygwin\bin\osgPlugQWidget: Must construct a QApplication before a QPaintDevice

РЕДАКТИРОВАТЬ № 2

Сигнал и слот отсутствовали в коде. Я только что добавил их в wrapper.h вместе с призывом к Q_OBJECT.

3

Решение

Немного поспав, я снова пересмотрел библиотеки, используемые в проекте. Проблема заключалась в том, что некоторые из этих библиотек находились в режиме отладки, а некоторые в режиме выпуска. При использовании сигналов и слотов, moc сошел с ума.

После строительства OSG отладить библиотеки, я попробовал еще раз мой маленький пример и работал.

Итак, готово!

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]