将OSG的osgViewerQt示例与Qt信号/插槽一起使用
Using OSG's osgViewerQt example with Qt signals/slots
我已经在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
调试库之后,我再次尝试了我的小示例并成功了。
所以它完成了!
相关文章:
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- Qt moveToThread,带有参数的信号/插槽
- moc 文件中缺少信号插槽
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 信号/插槽多线程 Qt
- 通过排队的QT信号插槽连接发送QSHAREDPOINTERS的QVECTOR
- Qimage没有通过信号插槽QT
- 使用 Qt5 的新信号/插槽实现向滑块发出信号
- 一个类中的QT信号/插槽,但从不同的线程发出
- 信号/插槽基类多继承
- 在QT C 中使用QMOVIE和信号/插槽之间在GIF中导航
- 在 for 循环中使用 lambda 函数连接信号插槽
- 不同类别的 2 个对象之间的信号/插槽
- 如何正确使用qt的信号/插槽系统
- Qt信号插槽视觉工作室:似乎未连接
- QACTION信号插槽中的无形UI
- Qt-连接触发动作中的信号/插槽
- Qt 信号插槽类范围类型
- 信号/插槽 Qt5 C++