下面是我i做的一个QT界面程序,
发现其中的的信息只在qt_metacall的case 0中messageX()添加有效,且只在QtTest.h中的message()反应,在其他message1(),message2()等均没反应。接下来必须要解决的问题就是:①怎么保证所设的信号(渲染信号)能分别在message1()、message2()等函数中响应,这是首要且最为迫切的问题
②怎么把渲染代码有效的添加到message()函数里,也做了些相关的实验,与理想效果有差距,电脑重装系统之类陆续出了些bug,如驱动不支持多纹理渲染等也要思考解决方案
moc_QtTest.h文件:
#include "QtTest.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'QtTest.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 62
#error "This file was generated using the moc from 4.6.2. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_MainWindow[] = {
// content:
4, // revision
0, // classname
0, 0, // classinfo
1, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
// slots: signature, parameters, type, tag, flags
12, 11, 11, 11, 0x08,
0 // eod
};
static const char qt_meta_stringdata_MainWindow[] = {
"MainWindow\0\0message()\0"
};
const QMetaObject MainWindow::staticMetaObject = {
{ &QMainWindow::staticMetaObject, qt_meta_stringdata_MainWindow,
qt_meta_data_MainWindow, 0 }
};
#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &MainWindow::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION
const QMetaObject *MainWindow::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}
void *MainWindow::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_MainWindow))
return static_cast<void*>(const_cast< MainWindow*>(this));
return QMainWindow::qt_metacast(_clname);
}
int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QMainWindow::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: message1(); break;
case 1: message2(); break;
case 2: message3(); break;
case 3: message4(); break;
default:;
}
_id -=4;
}
return _id;
}
QT_END_MOC_NAMESPACE
QtTest.h文件:
#pragma once
#ifndef QTTEST_H
#define QTTEST_H
#ifndef USE_QT4
#define USE_QT4 1
#endif
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgParticle/PrecipitationEffect>
#include <osgUtil/Optimizer>
#if USE_QT4
#include <QtCore/QString>
#include <QtCore/QTimer>
#include <QtGui/QKeyEvent>
#include <QtGui/QApplication>
#include <QtOpenGL/QGLWidget>
#include <QtGui/QMainWindow>
#include <QtGui/QMdiSubWindow>
#include <QtGui/QMdiArea>
#include <QtGui/QPushButton>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QVBoxLayout>
#include<QtGui/QMessageBox>
using Qt::WindowFlags;
#else
class QWidget;
#include <qtimer.h>
#include <qgl.h>
#include <qapplication.h>
#define WindowFlags WFlags
#endif
#include <iostream>
class AdapterWidget : public QGLWidget
{
public:
AdapterWidget( QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, WindowFlags f = 0 );
virtual ~AdapterWidget() {}
osgViewer::GraphicsWindow* getGraphicsWindow() { return _gw.get(); }
const osgViewer::GraphicsWindow* getGraphicsWindow() const { return _gw.get(); }
protected:
void init();
virtual void resizeGL( int width, int height );
virtual void keyPressEvent( QKeyEvent* event );
virtual void keyReleaseEvent( QKeyEvent* event );
virtual void mousePressEvent( QMouseEvent* event );
virtual void mouseReleaseEvent( QMouseEvent* event );
virtual void mouseMoveEvent( QMouseEvent* event );
osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _gw;
};
AdapterWidget::AdapterWidget( QWidget * parent, const char * name, const QGLWidget * shareWidget, WindowFlags f):
#if USE_QT4
QGLWidget(parent, shareWidget, f)
#else
QGLWidget(parent, name, shareWidget, f)
#endif
{
_gw = new osgViewer::GraphicsWindowEmbedded(0,0,width(),height());
#if USE_QT4
setFocusPolicy(Qt::ClickFocus);
#else
setFocusPolicy(QWidget::ClickFocus);
#endif
}
void AdapterWidget::resizeGL( int width, int height )
{
_gw->getEventQueue()->windowResize(0, 0, width, height );
_gw->resized(0,0,width,height);
}
void AdapterWidget::keyPressEvent( QKeyEvent* event )
{
#if USE_QT4
_gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) *(event->text().toAscii().data() ) );
#else
_gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) event->ascii() );
#endif
}
void AdapterWidget::keyReleaseEvent( QKeyEvent* event )
{
#if USE_QT4
_gw->getEventQueue()->keyRelease( (osgGA::GUIEventAdapter::KeySymbol) *(event->text().toAscii().data() ) );
#else
_gw->getEventQueue()->keyRelease( (osgGA::GUIEventAdapter::KeySymbol) event->ascii() );
#endif
}
void AdapterWidget::mousePressEvent( QMouseEvent* event )
{
int button = 0;
switch(event->button())
{
case(Qt::LeftButton): button = 1; break;
case(Qt::MidButton): button = 2; break;
case(Qt::RightButton): button = 3; break;
case(Qt::NoButton): button = 0; break;
default: button = 0; break;
}
_gw->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
}
void AdapterWidget::mouseReleaseEvent( QMouseEvent* event )
{
int button = 0;
switch(event->button())
{
case(Qt::LeftButton): button = 1; break;
case(Qt::MidButton): button = 2; break;
case(Qt::RightButton): button = 3; break;
case(Qt::NoButton): button = 0; break;
default: button = 0; break;
}
_gw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
}
void AdapterWidget::mouseMoveEvent( QMouseEvent* event )
{
_gw->getEventQueue()->mouseMotion(event->x(), event->y());
}
class ViewerQT : public osgViewer::Viewer, public AdapterWidget
{
public:
ViewerQT(QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, WindowFlags f = 0):
AdapterWidget( parent, name, shareWidget, f )
{
getCamera()->setViewport(new osg::Viewport(0,0,width(),height()));
getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width())/static_cast<double>(height()), 1.0f, 10000.0f);
getCamera()->setGraphicsContext(getGraphicsWindow());
setThreadingModel(osgViewer::Viewer::SingleThreaded);
connect(&_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
_timer.start(10);
}
virtual void paintGL()
{
frame();
}
//add interface element
// void createAction();
// void createMenu();
protected:
QTimer _timer;
// QMenu *fileMenu;
// QAction *openAction;
};
//void ViewerQT::createAction()
//{
// openAction=new QAction("&Open",this);
//}
//
//void ViewerQT::createMenu()
//{
// fileMenu=menuBar()->addMenu("&File");
// fileMenu->addAction(openAction);QtT
//}
class MainWindow: public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget* parent=0);
void inline createAction();
void inline createMenu();
protected:
ViewerQT* viewerWindow;
QMenu *fileMenu,*fileOptions;
QAction *openAction,*saveAction,*quitAction,*snowAction,*rainAction,*fogAction;
public slots:
void message1(); //处定义事件槽
void message2();
void message3();
void message4();
void message5();
void message6();
};
MainWindow::MainWindow(QWidget *parent )//界面设置
{
this->resize(400,300);
createAction();
createMenu();
}
void MainWindow::createAction(void)
{
openAction=new QAction("&Open",this);
QObject::connect(openAction,SIGNAL(triggered()),this,SLOT(message1()),Qt::AutoConnection);//事件响应
saveAction=new QAction("&Save",this);
QObject::connect(saveAction,SIGNAL(triggered()),this,SLOT(message2()),Qt::AutoConnection);
quitAction=new QAction("&Quit",this);
QObject::connect(quitAction,SIGNAL(triggered()),this,SLOT(message3()),Qt::AutoConnection);
snowAction=new QAction("&Snow",this);
QObject::connect(snowAction,SIGNAL(triggered()),this,SLOT(message4()),Qt::AutoConnection);
rainAction=new QAction("&Rain",this);
QObject::connect(rainAction,SIGNAL(triggered()),this,SLOT(message5()),Qt::AutoConnection);
fogAction=new QAction("&Fog",this);
QObject::connect(fogAction,SIGNAL(triggered()),this,SLOT(message6()),Qt::AutoConnection);
}
void MainWindow::createMenu(void)
{
fileMenu=menuBar()->addMenu("&File");
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addAction(quitAction);
fileOptions=menuBar()->addMenu("&Option");
fileOptions->addAction(snowAction);
fileOptions->addAction(rainAction);
fileOptions->addAction(fogAction);
}
void MainWindow::message1()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osg::ref_ptr<osg::Group> root = new osg::Group();
//申请一个粒子系统
osg::ref_ptr<osgParticle::PrecipitationEffect> pe = new osgParticle::PrecipitationEffect();
//设置雨的浓度
pe->rain(0.5f);
//设置背景色
viewer->getCamera()->setClearColor(pe->getFog()->getColor());
//读取模型
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("spaceship.osg");
//使用雾效
node->getOrCreateStateSet()->setAttributeAndModes(pe->getFog());
root->addChild(node.get());
root->addChild(pe.get());
//优化场景数据
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
}
void MainWindow::message2()
{
QMessageBox msgBox;
msgBox.setText("OK!");
msgBox.exec();
}
void MainWindow::message3()
{
}
void MainWindow::message4()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osg::ref_ptr<osg::Group> root = new osg::Group();
//申请一个粒子系统
osg::ref_ptr<osgParticle::PrecipitationEffect> pe = new osgParticle::PrecipitationEffect();
//设置雨的浓度
pe->rain(0.5f);
//设置背景色
viewer->getCamera()->setClearColor(pe->getFog()->getColor());
//读取模型
//osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(" argv[1]");
//使用雾效
//node->getOrCreateStateSet()->setAttributeAndModes(pe->getFog());
//root->addChild(node.get());
root->addChild(pe.get());
//优化场景数据
osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
// QMessageBox msgBox;
//msgBox.setText("OK!");
//msgBox.exec();
}
void message5()
{
}
void message6()
{
}
main.cpp文件:
#include <QtGui/QApplication>
#include <osgDB/ReadFile>
//#include <QtGui/QMainWindow>
#include "QtTest.h"
#include "moc_QtTest.h"int main(int argc, char *argv[])
{
QApplication app(argc, argv);
osg::ArgumentParser arguments(&argc, argv);
argv[1]="E:\\OSG\\osg2.8.0\\data\\cow.osg";
ViewerQT* viewerWindow = new ViewerQT;osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
if (!loadedModel)
{
std::cout << arguments[0] <<": No data loaded.use default data" << std::endl;
loadedModel=osgDB::readNodeFile("E:\\OSG\\osg2.8.0\\data\\cow.osg");
//return 1;
}
viewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
viewerWindow->setSceneData(loadedModel.get());
MainWindow* window=new MainWindow();
window->setCentralWidget(viewerWindow);
window->show();
return app.exec();
}
现在的问题是:怎么使Open按钮对应message1()函数的响应,同样的怎么使Save按钮对应message2()的函数。以此类推。