一、环境
- 操作系统: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.youkuaiyun.com/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(),定时刷新。
代码如下:
// 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
// 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); //清除颜色缓冲
}
// 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;
};
// 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++));
}
// 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();
}
代码通过OPENGL实现了一个简单的颜色变化的窗口,其他openGL相关的绘制和GLFW+OPENGL类似,不再介绍。
具体可以看QT+OpenGL实现Hello Triangle,绘制三角形
如果对OpenGL不熟悉,推荐在learningopengl进行系统学习:https://learnopengl-cn.github.io/
相关链接和参考
https://blog.youkuaiyun.com/qq_36290227/article/details/104953363
https://blog.youkuaiyun.com/WindSunLike/article/details/103945051
https://download.qt.io/development_releases/vsaddin/
https://blog.youkuaiyun.com/weixin_32155265/article/details/114905744
https://blog.youkuaiyun.com/qq_37996632/article/details/102550380
https://blog.youkuaiyun.com/weixin_44518102/article/details/119306516