当前位置:   article > 正文

Visual Studio 2022配置QT+OpenGL开发环境_qt-vs-tools-msvc2022

qt-vs-tools-msvc2022

一、环境

  • 操作系统: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中,需要新建一个控件类,继承QOpenGLWidgetQOpenGLFunctions,重写initializeGL/resizeGL/paintGL方法,initializeGL用于初始化opengl;resizeGL中重新计算相机相关参数;paintGL进行绘制,即openGL中主循环的部分,但此方法只有在移动窗口或显示/隐藏窗口时会被触发,因此还需新建一个定时器定时调用update()方法,主动触发paintGL(),定时刷新。
在这里插入图片描述

代码如下:

// GlWidget.h
#pragma once

#ifndef __GL_WIDGET_H__
#define __GL_WIDGET_H__

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QTimer>

class GlWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT

public:
    GlWidget(QWidget* parent = 0);
    ~GlWidget();

protected:
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;

private:
    QTimer* timer;
};

#endif // WIDGET_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
// GlWidget.cpp
#include "GlWidget.h"

GlWidget::GlWidget(QWidget* parent)
    : QOpenGLWidget(parent)
{
}

GlWidget::~GlWidget()
{

}

void GlWidget::initializeGL()
{
    this->initializeOpenGLFunctions();    //为当前上下文初始化提供OpenGL函数解析

    timer = new QTimer();
    timer->setInterval(33);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start();
}

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

void GlWidget::paintGL()
{
    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);    //清除颜色缓冲
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
// qt_test.h
#pragma once

#include <QtWidgets/QMainWindow>
#include <Qlabel>
#include <QPushButton>
#include <Qopenglwidget>
#include "ui_qt_test.h"
#include "GlWidget.h"

class qt_test : public QMainWindow
{
    Q_OBJECT

public:
    qt_test(QWidget *parent = Q_NULLPTR);
    void onButtonClick();

private:
    Ui::qt_testClass ui;
    QLabel* lab;
    QPushButton* button;

    GlWidget* opengl_widget;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
// qt_test.cpp
#include "qt_test.h"

qt_test::qt_test(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    this->opengl_widget = new GlWidget(this);
    this->opengl_widget->setGeometry(this->geometry());
    this->lab = new QLabel("Hello,World!", this);
    this->lab->setGeometry(10, 20, 100, 20);
    this->button = new QPushButton("test", this);
    this->button->setGeometry(10, 40, 100, 20);
	QObject::connect(this->button, &QPushButton::clicked, this, &qt_test::onButtonClick);
}

void qt_test::onButtonClick()
{
    static int i = 0;
    this->lab->setText(QString::number(i++));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
// main.cpp
#include "qt_test.h"
#include <QtWidgets/QApplication>

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

代码通过OPENGL实现了一个简单的颜色变化的窗口,其他openGL相关的绘制和GLFW+OPENGL类似,不再介绍。
具体可以看QT+OpenGL实现Hello Triangle,绘制三角形
在这里插入图片描述

如果对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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/118585
推荐阅读
相关标签
  

闽ICP备14008679号