Domanda

sembra che non sia possibile utilizzare glBindBuffer, glGenBuffer nella classe ereditata di QQuickPaintedItem.

Ho già provato a includere , ma non funziona e provo anche a utilizzare GLEW in QQuickPaintedItem.Sembra che Qt non definirebbe quelle funzioni in QQuickPaintedItem.

La mia versione di Qt è 5.1 msvc-opengl e il sistema funziona su desktop Win7.

messaggio del compilatore:

fcglpanel.cpp(254): error C3861: 'glBindBuffer': identifier not found

qualche codice

class MyQuickGLPanel :public QQuickPaintedItem 
{

Q_OBJECT

    //-------------------------------------------------------------------------
    public: 
        FCGLPanel(QQuickItem  * parent=0);
        ~FCGLPanel(); 
        virtual void paint(QPainter * painter);
    ...
}

principale

int main(int argc, char *argv[])
{
    QApplication app(argc, argv); 

    qmlRegisterType<MyQucikGLPanel>("MyQucikGLPanel", 1, 0, "MyPanel"); 

    QQmlApplicationEngine engine(QUrl::fromLocalFile("../qml/main.qml")); 

    QObject *topLevel = engine.rootObjects().value(0);
    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
    return qmlMode(argc, argv);
}

main.qml

import QtQuick 2.1
import QtQuick.Controls 1.0 
import QtQuick.Layouts 1.0
import QtQuick.Dialogs 1.0
import QtQuick.Window 2.1

import "./MyUI" 1.0 as MyUI
import MyQucikGLPanel 1.0

ApplicationWindow {
    id: appwindow

    property int zGLPanel : 4;

    SplitView {

        x: 32
        y: 8
        anchors.rightMargin: 5
        anchors.bottomMargin: 5
        anchors.leftMargin: 0
        anchors.topMargin: 0
        anchors.fill: parent

        // [EMBEDDING C++ object]
        MyPanel{
            id: mylogicPanel
            anchors.fill: parent
            width: 640
            height: 480
            z : appwindow.zGLPanel
        }
    }           
}

AGGIORNAMENTO

Elenca alcuni modi per evitare questo problema nella piattaforma Windows.

  1. Recupera il punto di ingresso di OpenGL tramite

    QOpenGLFunctions* oglEntry = window()->openglContext()->functions();

  2. Utilizza la creazione di contesti personalizzati nella tua QWindow.

    
    Window::Window( QScreen* screen )
    : QWindow( screen ){
    // Tell Qt we will use OpenGL for this window
    setSurfaceType( OpenGLSurface );
    
    // Specify the format and create platform-specific surface
    QSurfaceFormat format; 
    format.setMajorVersion( 4 );
    format.setMinorVersion( 3 ); 
    format.setProfile( QSurfaceFormat::CoreProfile );
    setFormat( format );
    create();
    
    // Create an OpenGL context
    m_context = new QOpenGLContext;
    m_context->setFormat( format );
    m_context->create();
      ....
    }
    

    RIF

    http://www.kdab.com/opengl-in-qt-5-1-part-1/

    Differenza nella velocità opengl tra Qt 4/5 e API Opengl

È stato utile?

Soluzione

Qt tenta di racchiudere molte funzionalità OpenGL in un'unica classe che contiene tutte le funzioni condivise (estese) tra GL e GL ES 2.0, chiamate QGLFunctions.

Piuttosto che usare GLEW, dovresti considerare QGLFunctions::glBindBuffer (...).Se chiami QGLFunctions::initializeGLFunctions (...) fa a quantità delle stesse cose di GLEW.

In effetti, probabilmente andresti avanti ed erediteresti questa classe in modo che qualsiasi chiamata a glBindBuffer (...) viene gestito automaticamente tramite l'ereditarietà di QGLFunctions.


La seguente descrizione è tratta dalla documentazione dell'SDK Qt per QGLFunctions:

QGLFunzioni fornisce un garantita API disponibile su tutti i sistemi OpenGL e che si occupa della risoluzione delle funzioni sui sistemi che ne hanno bisogno.Il modo consigliato per utilizzare QGLFunctions è tramite ereditarietà diretta:

class MyGLWidget : public QGLWidget, protected QGLFunctions
{
  Q_OBJECT
public:
  MyGLWidget(QWidget *parent = 0) : QGLWidget(parent) {}

protected:
  void initializeGL();
  void paintGL();
};

void MyGLWidget::initializeGL()
{
  initializeGLFunctions();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top