参考:  Visual Studio 2022配置QT+OpenGL开发环境_wk930523的博客-CSDN博客

一、环境
操作系统:Windows 11
IDE:Microsoft Visual Studio Community 2022 (64 位)
QT:5.12.12
二、安装Qt VS Tools
Qt VS Tools可以在Visual Studio中通过管理扩展进行安装,也可以直接下载扩展包文件进行安装。

在VS扩展中安装
打开扩展->管理扩展,搜索qt,下载Qt Visual Studio Tools,重启软件生效即可


下载安装
地址:https://download.qt.io/development_releases/vsaddin/
我安装的是qt-vsaddin-msvc2022-2.8.1.vsix

三、创建新项目
安装Qt VS Tools后可以在新建项目时看到Qt相关的工程,选择Qt Widgets Application


如果第一次创建时提示下面界面,需要设置Qt版本和路径

在VS中扩展->Qt VS Tools->Qt Versions,设置QT路径

创建成功。

问题:
双击.ui文件打开Qt Designer,会闪退并报错

解决方法如下:
https://blog.csdn.net/weixin_32155265/article/details/114905744

四、使用openGL
在QT中使用OpenGL和直接使用OpenGL并没有本质区别,只不过是使用qt窗口替换了GLFW窗口设计,使用initializeOpenGLFunctions代替GLAD管理OpenGL函数指针。

在QT中,需要新建一个控件类,继承QOpenGLWidget和QOpenGLFunctions,重写initializeGL/resizeGL/paintGL方法,initializeGL用于初始化opengl;resizeGL中重新计算相机相关参数;paintGL进行绘制,即openGL中主循环的部分,但此方法只有在移动窗口或显示/隐藏窗口时会被触发,因此还需新建一个定时器定时调用update()方法,主动触发paintGL(),定时刷新。

在这里插入图片描述

拖拽一个OpenGL控件

创建一个继承自QOpenGLWidgets的类

 选择Widgets Class

 设置父类  QOpenGLWidget

  设置类名为:QtMyOpenGLWidgetsClass

重写这个类的paintGL即可实现绘制,ui部分自动衔接由QT框架已经处理好了。

手动添加父类, public QOpenGLFunctions

包含头文件:#include <QOpenGLFunctions>

提升.ui文件中OpenGL控件的类名为自定义类型:记事本打开手动修改为QtMyOpenGLWidgetsClass最好

在Qt Designer更改部件类名_荆楚闲人的博客-CSDN博客

记事本将原来的QOpenGLWidget作为类型的控件类名改为自己的,就可以直接编译运行了。

代码如下:

// QtMyOpenGLWidgetsClass.h

#pragma once

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include "ui_QtMyOpenGLWidgetsClass.h"
#include <QTimer>

class QtMyOpenGLWidgetsClass : public QOpenGLWidget, public QOpenGLFunctions
{
	Q_OBJECT

public:
	QtMyOpenGLWidgetsClass(QWidget *parent = Q_NULLPTR);
	~QtMyOpenGLWidgetsClass();
private:
	void initializeGL() override;
	void resizeGL(int w, int h) override;
	void paintGL() override;

private:
	Ui::QtMyOpenGLWidgetsClass ui;
	QTimer timer;
};

// QtMyOpenGLWidgetsClass.cpp

#include "QtMyOpenGLWidgetsClass.h"

QtMyOpenGLWidgetsClass::QtMyOpenGLWidgetsClass(QWidget *parent)
	: QOpenGLWidget(parent)
{
	ui.setupUi(this);
}

QtMyOpenGLWidgetsClass::~QtMyOpenGLWidgetsClass()
{
}

void QtMyOpenGLWidgetsClass::initializeGL()
{
	this->initializeOpenGLFunctions();    //为当前上下文初始化提供OpenGL函数解析
	glClearColor(0, 0, 0, 1);
	timer.setInterval(33);
	connect(&timer, SIGNAL(timeout()), this, SLOT(update()));
	timer.start();
}

void QtMyOpenGLWidgetsClass::resizeGL(int w, int h)
{
	glViewport(0.0f, 0.0f, w, h);    //调整视口
}

void QtMyOpenGLWidgetsClass::paintGL()
{
	makeCurrent();
	static float r = 0.0, g = 0.0, b = 0.0;
	r += 0.01;
	g += 0.02;
	b += 0.03;
	if (r > 1)r = 0;
	if (g > 1)g = 0;
	if (b > 1)b = 0;
	glClearColor(r, g, b, 1.0f);    //清屏
	glClear(GL_COLOR_BUFFER_BIT);    //清除颜色缓冲
}


// qtopenglrender.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_qtopenglrender.h"
#include "QtMyOpenGLWidgetsClass.h"

class QtOpenGLRender : public QMainWindow 
{
    Q_OBJECT

public:
    QtOpenGLRender(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtOpenGLRenderClass ui;
	QtMyOpenGLWidgetsClass my;
};

// qtopenglrender.cpp

#include "qtopenglrender.h"
#include "stdafx.h"

QtOpenGLRender::QtOpenGLRender(QWidget *parent)
    : QMainWindow(parent),my(parent)
{
    ui.setupUi(this);
}


// main.cpp

#include "qtopenglrender.h"
#include "stdafx.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtOpenGLRender w;
    w.show();
    return a.exec();
}


代码通过OPENGL实现了一个简单的颜色变化的窗口


如果对OpenGL不熟悉,推荐在learningopengl进行系统学习:https://learnopengl-cn.github.io/

 相关链接和参考
https://blog.csdn.net/qq_36290227/article/details/104953363
https://blog.csdn.net/WindSunLike/article/details/103945051
https://download.qt.io/development_releases/vsaddin/
https://blog.csdn.net/weixin_32155265/article/details/114905744
https://blog.csdn.net/qq_37996632/article/details/102550380
https://blog.csdn.net/weixin_44518102/article/details/119306516
————————————————
版权声明:本文为CSDN博主「wk930523」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013595260/article/details/123812264

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐