1. 常用的宏
宏
功能
CMAKE_CURRENT_SOURCE_DIR
当前访问的 CMakeLists.txt 文件所在的路径
PROJECT_SOURCE_DIR
使用cmake命令时,后面紧跟的目录,一般是工程的根目录
EXECUTABLE_OUTPUT_PATH
指定输出的目录(CMake 3.0 版本开始已被弃用)
LIBRARY_OUTPUT_PATH
指定输出库目录(CMake 3.0 版本开始已被弃用)
CMAKE_AUTORCC
指定CMake是否会自动处理Qt资源文件
CMAKE_BINARY_DIR
可执行程序的输出路径
2. 最简单的CMakeLists.txt文件12345678# 指定使用的 cmake 的最低版本cmake_minimum_required(VERSION 3.8) # 项目名称 项目版本 项目使用的编程语言project (Master VERSION 0.1 LANGUAGES CXX)# 可执行程序名 源文件名称add_executable (app main.cpp)
...
1. Windows平台1.1 使用windeployqt.exe工具打包可以为windeployqt.exe添加环境变量
1.1.1 无法定位程序的输入点原因:windeployqt.exe工具在查询所需库时首先从环境变量中进行寻找,没有使用Qt本身下的路径。
比如:D:\Qt\Qt5.15.2\5.15.2\mingw81_32\plugins\platforms目录下复制qwindows.dll到运行目录下的platforms文件夹下
可以使用everything工具查看
1.2. 打包使用Inno Setup软件进行打包
2. Linux平台2.1 linuxdeployqt下载安装 下载地址:https://github.com/probonopd/linuxdeployqt/releases
123456mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqtchmod 777 linuxdeployqtsudo mv linuxdeployqt /usr/local/bin# 测试 ...
自定义窗口类继承QWidget不显示主要是因为QSS样式不生效
QWidget仅仅支持background,background-clip和background-origin属性(其实和不支持qss也没差多少…)。如果你继承自QWidget自定义一个窗口,那么你需要重写 paintEvent事件,当然文档里已经给你写好了,直接粘贴进去就可以了。下面列一份代码段:
12345678void CustomWidget::paintEvent(QPaintEvent *event){ QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);}
在 Windows 系统里链接动态库时,编译阶段链接的是动态库的导入库(.lib 文件),而程序运行时依赖的是具体的动态链接库(.dll 文件)
编译阶段:链接导入库
导入库的作用:导入库是一个相对较小的文件,它主要包含了动态链接库中导出函数和变量的符号信息,如函数名、参数类型、返回值类型等。在编译和链接过程中,链接器会读取导入库中的符号信息,并将这些信息嵌入到可执行文件中。这样,可执行文件在运行时就知道要从哪个动态链接库中加载哪些函数和变量。
链接方式:在 Qt 的 .pro 文件或者其他编译配置中,使用 -l 和 -L 选项来指定要链接的导入库。
12345678910111213win32: { LIBS += -L$$DESTDIR/ffmpeg/lib/ # 动态库路径 # 动态导入库 下列都是动态导入库,不是静态库 LIBS += "$$PWD/ffmpeg/lib/avcodec.lib" LIBS += "$$PWD/ffmpeg/lib/avdevice.lib" LIBS += &qu ...
成员变量初始化方式分析uint32_t mWidth {0}; 与 uint32_t mWidth = 0;
uint32_t mWidth {0}; 这种初始化方式是可以的,它使用了 C++11 引入的统一初始化语法(也称为列表初始化),和传统的 uint32_t mWidth = 0; 初始化方式各有特点,下面为你详细分析:
语法解释
**uint32_t mWidth = 0;**:这是 C++ 从 C 语言继承而来的传统初始化方式,称为拷贝初始化(copy initialization)。它会先创建一个临时对象,然后将这个临时对象的值拷贝给要初始化的变量。对于像 uint32_t 这种基本数据类型,编译器通常会进行优化,直接将值赋给变量,不会有额外的性能开销。
**uint32_t mWidth {0};**:这是 C++11 引入的统一初始化语法,也叫列表初始化(list initialization)或大括号初始化(brace initialization)。使用这种方式初始化时,变量会直接被初始化为大括号内的值, ...
1. QT5.15.2在程序退出时崩溃:提示QBasicTimer::start: QBasicTimer can only be used with threads started with QThread
我的是QComboBox引发的问题,我最开始因为一些原因将主界面设置成了单例类,去掉之后就好了。
引发的原因可以不一样,可以通过一点一点删除最后定位到原因。
1. 函数解析1initializeOpenGLFunctions();
初始化OpenGL函数,将Qt里的函数指针指向显卡的函数,这样如glGenBuffers()这样的函数实际操作的就是显卡上的内存了。
1.1 VBOVBO(Vertex Buffer Object):顶点缓冲区对象。
VBO 是一种用于在 GPU 中存储数据(例如顶点数据)的缓冲区对象。
VBO 存储的是实际的顶点数据、索引数据,如坐标分量,颜色等。
通过把顶点数据上传到 VBO 中,可以让 OpenGL 在渲染过程中直接从显存读取数据。
VBO 不保存顶点数据的布局或如何处理这些数据的信息。它只是简单地存储一段内存区域,数据是原始的顶点数据。
12unsigned int VBO;glGenBuffers(1, &VBO);
unsigned int VBO;是在CPU上创建了一个int类型的缓冲Id。
glGenBuffers(1, &VBO);相当于在GPU上创建了一个缓冲区对象标识符(buffer object identifier),也就是一个在 OpenGL 上下文中使用的唯一 ...
项目仓库:
1git clone https://gitee.com/yongwang12138/learn-open-gl.git
1. 新建项目
2. 新建OpenGL类继承于QOpenGLWidget和QOpenGLFunctions
3. 重写对应的虚函数
4. 将界面上的对象提升为自定义的OpenGL类
1. 添加opengl模块1QT += openglwidgets
2. 创建OpenGL Widget需要继承QOpenGLWidget和QOpenGLFunctions_4_5_Core类和重写虚函数。
virtual void initializeGL(); virtual void resizeGL(int w, int h); virtual void paintGL();
12345678910111213141516171819202122232425262728#ifndef TESTOPENGLWIDGET_H#define TESTOPENGLWIDGET_H#include <QOpenGLWidget>#include <QOpenGLFunctions_4_5_Core>class TestOpenGLWidget : public QOpenGLWidget, QOpenGLFunctions_4_5_Core{ Q_OBJECTpublic: enum Shape { ...