кажется, я не могу использовать 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.
Получите точку входа OpenGL через
QOpenGLFunctions* oglEntry = window()->openglContext()->functions();
Используйте настраиваемое создание контекста в вашем 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(); .... }
ССЫЛКА
QGLWidget
, другой вариант использования — создать объектQGLFunctions
из любого контекста OpenGL, а затем квалифицировать все ваши вызовы GL какgl_functions.glBindBuffer (...)
. На некоторых платформах функции расширения GL специфичны для контекста, поэтому вам может понадобиться активный контекст в вызывающем потоке, прежде чем вы сможете это сделать — GLX немного странный, поскольку вы можете законно загружать указатели функций без контекста. 12.04.2014QGLFunctions
можно безопасно использовать только с контекстом OpenGL, который был активен при его инициализации. В Linux вы можете инициализировать его и использовать в любом контексте. Поскольку это Qt, и вы должны сосредоточиться на переносимости, вы должны удовлетворить более строгие требования Windows (WGL), а не Linux (GLX). 12.04.2014