之前也是各个地方找,习惯用百度,主要大多是中文的 .找出来的呢大多是我不需要的. 最后是用.....那个大哥了,
1.main.qml
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QMLQFBO 1.0
Window {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
Rectangle{
anchors.fill: parent;
color:"#33333350"
QMLQFBO{
id:models;
anchors.fill: parent;
}
}
Text {
id: time ;
text: qsTr(models.fnGetTestStr());
font.family: "微软雅黑"
font.pixelSize: 16;
}
Timer{
interval: 1000;
running: true;
repeat: true;
onTriggered: time.text=Date().toString();
}
}
2. main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include "qFramebuffer.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qmlRegisterType<CQFramebuffer>("QMLQFBO", 1, 0, "QMLQFBO");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
3.qFramebuffer.h
#include <QQuickFramebufferObject>
#include "qFramebufferRender.h"
#include <QVector3D>
class CQFramebuffer:public QQuickFramebufferObject
{
Q_OBJECT
public:
CQFramebuffer();
~CQFramebuffer();
// QQuickFramebufferObject interface
public:
Renderer *createRenderer() const;
public:
Q_INVOKABLE QString fnGetTestStr();
};
qFramebuffer.cpp
#include "qFramebuffer.h"
CQFramebuffer::CQFramebuffer()
{
}
CQFramebuffer::~CQFramebuffer()
{
}
/**
* @brief QFBO::createRenderer
* @return
*/
QQuickFramebufferObject::Renderer *CQFramebuffer::createRenderer()const
{
CQFramebufferRender *cQFBOr = new CQFramebufferRender();
return cQFBOr;
}
QString CQFramebuffer::fnGetTestStr()
{
return "成功返回";
}
3.qFramebufferRender.h
#pragma once
#include <QQuickFramebufferObject>
#include <QOpenGLFramebufferObject>
#include <QOpenGLFunctions>
#include <freeglut.h>
#include "qFramebuffer.h"
#include <QVector3D>
#pragma comment(lib,"freeglut.lib")
/**
* @brief The CQFramebufferRenderclass QQuickFramebufferObject::Renderer
* @author yuping
* @param
* @date
*/
class CQFramebufferRender:public QQuickFramebufferObject::Renderer
{
public:
CQFramebufferRender();
~CQFramebufferRender();
// Renderer interface
public:
void render();
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size);
void synchronize(QQuickFramebufferObject *);
public:
float m_Scale/*保存当前缩放量*/,
m_ScaleFactor/*缩放因子*/,
m_ScaleMax, m_ScaleMin,
m_Angle/*保存当前的旋转角度*/,
m_AngleFactor,
m_AngleY, m_AngleX;
public:
void fnDisplay();
private:
void fnInitGL();
};
.qFramebufferRender.cpp
#include "qFramebufferRender.h"
CQFramebufferRender::CQFramebufferRender()
{
this->m_Angle = 1.0f;
this->m_Scale = 1.0f;
this->m_AngleFactor = 0.1f;
this->m_AngleX =
this->m_AngleY = 1.0f;
this->m_ScaleFactor = 0.5f;
this->m_ScaleMax = 4.0f;
this->m_ScaleMin = 0.5f;
this->fnInitGL();
}
CQFramebufferRender::~CQFramebufferRender()
{
}
QOpenGLFramebufferObject *CQFramebufferRender::createFramebufferObject(const QSize &size)
{ // create opengl FBO
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setSamples(4);
QOpenGLFramebufferObject *qoglfbo = new QOpenGLFramebufferObject(size, format);
this->fnInitGL();
return qoglfbo;
}
//开始每帧的渲染工作
void CQFramebufferRender::render()
{
QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
glFuncs.glUseProgram(0);
this->fnDisplay();
update();
}
/**
* @brief CQFBOr::synchronize 窗口大小改变时
* @param item
*/
void CQFramebufferRender::synchronize(QQuickFramebufferObject *item)
{
CQFramebuffer *fbitem = static_cast<CQFramebuffer *>(item);
}
void CQFramebufferRender::fnDisplay()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
#pragma region 二,与调整模型的位置来实现 平移,旋转,缩放
glRotatef(m_AngleX,1.0f,0,0);//绕X轴
//glRotatef(m_AngleY,0.0f,1.0f,0.0f);//绕Y轴
//glRotatef(angle,0.0f,0.0f,1.0f);//绕Z轴
// glScalef(m_Scale,m_Scale,m_Scale);//缩放
#pragma endregion
glPushMatrix();
glTranslatef(0,0,0);
glLineWidth(5.5f);
glBegin(GL_LINES);
glColor3f(0.5f,0.0f,0.0f);
glVertex2f(-0.5f,0);
glVertex2f(0.5f,0);
glColor3f(0.0f,0.5f,1.0f);
glVertex3f(0,-0.5f,0.2f);
glVertex3f(0,1.5f,0.2f);
glEnd();
glPopMatrix();
}
//只初始化一次
void CQFramebufferRender::fnInitGL()
{
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glShadeModel(GL_SMOOTH);//着色模式平滑
glClearColor(0.2f, 0.2f, 0.2f, 0.5f);//设置背景颜色
glClearDepth(1.0f); //设置深度缓存的清除值
glEnable(GL_DEPTH_TEST); //开启深度检测
glDepthFunc(GL_LEQUAL); //油墨深度缓存的函数,然后,靠近的就绘制在上面
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//视图修正 打开最高质量渲染
//glEnable(GL_LIGHT0);//打开1号光源
glMatrixMode(GL_PROJECTION);//设置当前矩阵为透视矩阵
glLoadIdentity();//加载一个单位矩阵
gluPerspective(60.0f,1, 1,5000);//设置透视参数
glMatrixMode(GL_MODELVIEW);// -----模型视图矩阵
glLoadIdentity();
glClearColor(1.0f,0.6f,0.1f,0.5f);
gluLookAt(0.0f,0.0f,20.0f, //eye x,y,z
0, 0, 0, //center x,y,z
0.0f, 1.0f, 0.0f);//up x,y,z
}
大功告成!
最后你看见是两条线 一条不动一条以x轴旋转 ..以后的主慢慢来咯
最,最,最,简单的入门了.......