• 8441阅读
  • 2回复

[提问]关于QT中moc函数 响应问题 求高手指导 [复制链接]

上一主题 下一主题
离线clik
 
只看楼主 倒序阅读 楼主  发表于: 2011-07-10
下面是我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()的函数。以此类推。
离线clik
只看该作者 1楼 发表于: 2011-07-13
有人知道怎么回事么?~·
离线dbzhang800

只看该作者 2楼 发表于: 2011-07-13
建议你换种提问的方式,不然,你帖的这些东西没人会看,即使看,也看不懂。

如果你确认是moc出问题,你可以将你的程序在保持完整(别人拿到可以直接编译运行的哪种)的情况下,去掉所有和你的问题不相关的代码,精简到100行(这个要求一般都不算过分)以内。然后给出。

想 moc_xxx.cpp 这种中间产物不要贴出,即使是你确认是它的问题,也没有必要贴。

http://www.beiww.com/doc/oss/smart-questions.html
快速回复
限100 字节
 
上一个 下一个