【发布时间】:2023-12-09 06:59:01
【问题描述】:
我已经在 OSG 邮件列表中发布了这个,但是邮件列表似乎有点慢。
无论如何,我正在尝试通过添加我的新类来修改 osgViewerQt example 拥有将包含查看器。设计是:
- wrapper.h:定义类Wrapper。它继承自 QMainWindow 并且有一个 QDockWidget ViewerWidget 将被附加的位置。
- viewer.h:定义 ViewerWidget 类。这是来自的班级 例如,我制作了一些模组。
- prueba_qt.cpp:主函数和创建 QApplication 的位置。 Wrapper 对象是 在这里创建。
项目可以编译,但是执行的时候报错:
QWidget: Must construct a QApplication before a QPaintDevice*
如果我删除 Q_OBJECT 行、signal 和 slot 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文件,因此信号/槽机制需要一个。)
#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 并得到了 this 巨大的输出。出现错误的行是:
FindFileInPath() : trying C:\cygwin\bin\osgPlugQWidget: Must construct a QApplication before a QPaintDevice
编辑#2
代码中缺少信号和槽。我刚刚将它们添加到 wrapper.h 以及对 Q_OBJECT 的调用。
【问题讨论】:
标签: c++ qt4 signals-slots openscenegraph