Вопрос

кажется, я не могу использовать glBindBuffer, glGenBuffer в унаследованном классе QQuickPaintedItem.

Я уже пытаюсь включить , но это не работает, и я также пытаюсь использовать GLEW в QQuickPaintedItem.Похоже, что Qt отменит определение этих функций в QQuickPaintedItem.

Моя версия Qt — 5.1 msvc-opengl, и система работает на рабочем столе Win7.

сообщение компилятора:

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

какой-то код

class MyQuickGLPanel :public QQuickPaintedItem 
{

Q_OBJECT

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

основной

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
        }
    }           
}

ОБНОВЛЯТЬ

Перечислите способ избежать этой проблемы на платформе Windows.

  1. Получите точку входа OpenGL через

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

  2. Используйте создание индивидуального контекста в вашем 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();
      ....
    }
    

    ССЫЛКА

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

    Разница в скорости Opengl между Qt 4/5 и Opengl API

Это было полезно?

Решение

Qt пытается объединить множество функций OpenGL в один класс, который содержит все (расширенные) общие функции между GL и GL ES 2.0, называемые QGLFunctions.

Вместо использования GLEW вам следует рассмотреть возможность QGLFunctions::glBindBuffer (...).Если вы позвоните QGLFunctions::initializeGLFunctions (...) это делает много того же, что и GLEW.

Фактически, вы, вероятно, могли бы унаследовать этот класс, чтобы любой вызов glBindBuffer (...) автоматически обрабатывается посредством наследования QGLFunctions.


Следующее описание взято из документации Qt SDK для QGLFunctions:

QGLФункции обеспечивает гарантированный API, который доступен во всех системах OpenGL и обеспечивает разрешение функций в системах, которые в этом нуждаются.Рекомендуемый способ использования QGLFunctions — прямое наследование:

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

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

void MyGLWidget::initializeGL()
{
  initializeGLFunctions();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top