QT6安装与概念介绍
文章目录
- 前言
- install
- Modules
- Qt Core
- 元对象系统
- 属性系统
- 对象模型
- 对象树和所有者
- 信号 & 槽
前言
QT不是纯粹的C++标准,它在此基础上引入MOC编译器,在调用C++编译器之前会使用该编译器将非C++的内容如 Q_OBJECT、signal:等进行处理。此外QT还引入了对象间通讯的机制 信号和槽就以来MOC。
install
https://doc.qt.io/qtcreator/creator-how-to-install.html
git clone git://code.qt.io/qt/qt5.git QT6
git clone https://code.qt.io/qt/qt5.git QT6
cd QT6
git checkout v6.8.2
mkdir build-qt6
cd build-qt6
../configure -init-submodules # 同步子库,然后执行 cmake .. 指令
cmake --build . --parallel # 编译qt库
cmake --install . # /usr/local/Qt-6.8.2/
Building Qt Creator from Git
https://wiki.qt.io/Building_Qt_Creator_from_Git
Building Qt 6 from Git
https://wiki.qt.io/Building_Qt_6_from_Git
https://doc.qt.io/qt-6/getting-sources-from-git.html
qt系列工具及其作用
Qt各平台支持插件 libqxcb.so 安装
../configure -nomake examples -nomake tests -xcb # 声明构建xcb库
[-submodules qtdeclarative]
../configure -nomake examples -nomake tests -xcb -submodules qtbaseWARNING: Could not find all necessary libraries for qpa-xcb support.
-- LIBDRM libray not found
-- XCOMPOSITE libray not found
-- XCURSOR libray not found
-- XRANDR libray not found
-- XI libray not found
-- XSHMFENCE libray not found
-- XTST libray not found
-- XKBCOMMON libray not found
-- XKBFILE libray not foundsudo apt-get install -y \libdrm-dev \libxcomposite-dev \libxcursor-dev \libxrandr-dev \libxi-dev \libxshmfence-dev \libxtst-dev \libxkbcommon-dev \libxkbfile-devsudo apt install libxcb1-dev libxcb-xkb-dev libxcb-util-dev libxcb-icccm4-dev
sudo apt install libxkbcommon-x11-dev
sudo apt install libdbus-1-dev at-spi2-coresudo apt install \libxcb1-dev \libxcb-xkb-dev \libxcb-util-dev \libxcb-icccm4-dev \libxcb-image0-dev \libxcb-keysyms1-dev \libxcb-render-util0-dev \libxcb-shm0-dev \libxcb-xinerama0-dev \libxcb-xinput-dev \libxcb-xfixes0-dev \libxcb-randr0-dev
Modules
https://doc.qt.io/qt-6/qtmodules.html
Qt Essentials
Qt要素定义了Qt在所有平台上的基础。它们可以在所有受支持的开发平台上使用。基本模块是通用的,对大多数Qt应用程序都很有用。用于特殊目的的模块被视为附加模块,即使它在所有支持的平台上都可用。
Qt Core
被其他模块使用的非图形化类核心,它向C++添加了如下特性:
- 一个强大的无缝对象通讯机制 —— signals and slots
- 可查询、可设计的对象属性
- 层次化和可查询的对象树,用保护指针(QPointer)以自然的方式组织对象所有权
- 一个跨库边界的动态转换
使用该模块
find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
元对象系统
qt的元对象系统提供了信号和槽机制,用于对象间通讯,运行时类型信息和动态属性系统。
- QObject类为对象提供获取元对象系统优势的基类
- Q_OBJECT宏用于确保元对象特性,如动态属性、信号和槽
- Meta-Object Compiler(MOC, 用于处理Q_OBJECT等宏的预处理器)为每个QObject子类插入必要的用于实现元对象特性的代码
moc读取C++源码,如果发现 Q_OBJECT 宏,则生成额外的moc*.cpp文件,它包含源对象代码。如何包含信号和槽机制还包含的特性:
- QObject::metaObject() returns the associated meta-object for the class.
- QMetaObject::className()在运行时返回类名string
- QObject::inherits() 函数 返回对象是否是继承QObject继承树中指定类的类的实例
- QObject::tr() 转换字符串以实现国际化
- QObject::setProperty() and QObject::property() 通过名称动态设置和获取属性
- QMetaObject::newInstance() constructs a new instance of the class.
qobject_cast 类似 dynamic_cast// MyWidget inherits from QWidget and is declared with the Q_OBJECT macro:
QObject *obj = new MyWidget;
QWidget *widget = qobject_cast<QWidget*>(obj);
MyWidget *myWidget = qobject_cast<MyWidget *>(obj);// 下面的转换都会失败,返回 nullptr
if (QLabel *label = qobject_cast<QLabel *>(obj)) {label->setText(tr("Ping"));
} else if (QPushButton *button = qobject_cast<QPushButton *>(obj)) {button->setText(tr("Pong!"));
}
对于没有Q_OBJECT的子类,它的元对象特性和它最近的QObject父类一致;如果没有添加Q_OBJECT宏则源对象特性将不可用
Therefore, we strongly recommend that all subclasses of QObject use the Q_OBJECT macro regardless of whether or not they actually use signals, slots, and properties.
属性系统
Q_PROPERTY(type name(READ getFunction [WRITE setFunction] |MEMBER memberName [(READ getFunction | WRITE setFunction)])[RESET resetFunction][NOTIFY notifySignal][REVISION int | REVISION(int[, int])][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][BINDABLE bindableProperty][CONSTANT][FINAL][REQUIRED])// 下面是分别用普通方法和 Meta-Object System
QPushButton *button = new QPushButton;
QObject *object = button;button->setDown(true);
object->setProperty("down", true);
运行时获取未知类型的属性
QObject *object = ...
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i=0; i<count; ++i) {QMetaProperty metaproperty = metaobject->property(i);const char *name = metaproperty.name();QVariant value = object->property(name);...
}
class MyClass : public QObject
{// MOC macroQ_OBJECTQ_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)public:MyClass(QObject *parent = nullptr);~MyClass();enum Priority { High, Low, VeryHigh, VeryLow };// moc grammaQ_ENUM(Priority)void setPriority(Priority priority){if (m_priority == priority)return;m_priority = priority;emit priorityChanged(priority);}Priority priority() const{ return m_priority; }signals:void priorityChanged(Priority);private:Priority m_priority;
};MyClass *myinstance = new MyClass;
QObject *object = myinstance;myinstance->setPriority(MyClass::VeryHigh);
object->setProperty("priority", "VeryHigh");
对象模型
C++对象模型是高效的,但在某些领域不够灵活;GUI编程需要运行时高效和高层次灵活性,Qt通过组合C++的高效率和Qt对象模型的灵活性提供了这些特性。
Qt向C++中添加了如下特性:
- 信号与槽——对象间通讯机制
- 可查询和可设计的对象属性
- 事件和事件过滤器
- 上下文string翻译国际化
- 复杂的间隔驱动计时器,可以在事件驱动的GUI中优雅地集成许多任务
- 层次化和可查询的对象树
- QPointer,指针对象析构自动设0
- 跨库的 dynamic cast
- 支持自定义类型创建
许多Qt特性通过 标准C++基于继承QObject类 实现,object communication mechanism and the dynamic property system,需要 Meta-Object System provided by Qt’s own Meta-Object Compiler (moc).
Meta-Object System 是对C++标准的扩展,让其更适用于GUI编程
QObject对象是一个身份、克隆(意味不完全一样),值拷贝会带来一些列问题,copy constructor and assignment operator disabled.
对象树和所有者
当创建从其他QObject继承的QObject对象时,会向父类的children()中添加该对象,父类析构也会析构子对象。这很符合GUI对象的需要。
调试函数 QObject::dumpObjectTree() and QObject::dumpObjectInfo() are often useful when an application looks or acts strangely.
对象树中任意节点析构会自动析构它的所有孩子节点,自动从父节点中将该节点移除
考虑下面的例子:
int main()
{QWidget window;QPushButton quit("Quit", &window);...
}
// 先析构临时变量quit,然后从父对象中移除它,最后析构windowint main()
{QPushButton quit("Quit");QWidget window;quit.setParent(&window);...
}
// 先析构window,同时它的子对象也都析构了(即,quit析构),然后再析构quit,duang!!!quit析构两次
信号 & 槽
传统的通知方法是用回调函数,当事件来临时,我的方法会被调用。信号和槽机制用于替代该方法。当某个事件发生时会发射一个信号,Qt’s widgets有许多预定义的信号,用户也可以添加自定义信号;槽是一个函数,当某一信号发射时会被调用,Qt’s widgets预定义了许多槽,用户也可以添加自己的槽。
信号是具有public属性的函数,能够从任何地方发射,但建议仅从signal处发射。当发出信号时,连接到它的插槽通常会立即执行,就像正常的函数调用一样。当这种情况发生时,信号和槽机制完全独立于任何GUI事件循环。一旦所有插槽都返回,就会执行emit语句后的代码。使用排队连接时,情况略有不同;在这种情况下,emit关键字后面的代码将立即继续,稍后将执行插槽。如果多个插槽连接到一个信号,则在发出信号时,这些插槽将按照连接的顺序一个接一个地执行。
信号由moc自动生成,不得在.cpp文件中实现。
槽是一个普通的C++函数,成员的私有属性不影响槽函数被调用。槽函数也可以是虚函数。
class Counter : public QObject
{Q_OBJECT
// Note. The Q_OBJECT macro starts a private section.
// To declare public members, use the 'public:' access modifier.
public:Counter() { value_ = 0; }int value() const { return value_; }public slots:void setValue(int value){if (value != value_) {value_ = value;emit valueChanged(value);} }
signals:void valueChanged(int newValue) {}private:int value_;
};Counter a, b;QObject::connect(&a, &Counter::valueChanged,&b, &Counter::setValue);a.setValue(12); // a.value() == 12, b.value() == 12b.setValue(48); // a.value() == 12, b.value() == 48printf("%d, %d\n", a.value(), b.value());
相关文章:

QT6安装与概念介绍
文章目录 前言installModulesQt Core元对象系统属性系统对象模型对象树和所有者信号 & 槽 前言 QT不是纯粹的C标准,它在此基础上引入MOC编译器,在调用C编译器之前会使用该编译器将非C的内容如 Q_OBJECT、signal:等进行处理。此外QT还引入了对象间通…...
Python包管理工具uv 国内源配置
macOS 下 .config/uv/uv.toml内 pip源 [[index]] url "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/" default true#uv python install 下载源配置无效,需要在项目里配置 # python-install-mirror "https://mirror.nju.edu.cn/githu…...
ABP VNext + Webhook:订阅与异步回调
🚀 ABP VNext Webhook:订阅与异步回调 📚 目录 🚀 ABP VNext Webhook:订阅与异步回调🎯 一、背景切入:如何优雅地支持第三方回调?🏗 二、系统架构设计🔍 三…...

Docker(二):开机自启动与基础配置、镜像加速器优化与疑难排查指南
引言 docker 的快速部署与高效运行依赖于两大核心环节:基础环境搭建与镜像生态优化。本期博文从零开始,系统讲解 docker 服务的管理配置与镜像加速实践。第一部分聚焦 docker 服务的安装、权限控制与自启动设置,确保环境稳定可用;…...

Lua基础语法
文章目录 一、注释二、 数据类型1. 注意事项2. 全局/局部变量 三、 标识符1. 保留字2. 变量3. 动态类型 四、 运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 其他运算符 五、 函数1. 固定参函数2. 可变参函数3. 可返回多个值4. 函数作为参数 六、循环控制语句1. while...do…...

2025年渗透测试面试题总结-匿名[实习]安全工程师(安全厂商)(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一面技术问题 1. Burp插件原理 2. JavaWeb项目经验 3. CC1-7链原理(以CC6为例࿰…...

【node.js】实战项目
个人主页:Guiat 归属专栏:node.js 文章目录 1. 项目概览与架构设计1.1 实战项目:企业级电商管理系统1.2 技术栈选择 2. 项目初始化与基础架构2.1 项目结构设计2.2 基础配置管理 3. 用户服务实现3.1 用户服务架构3.2 用户模型设计3.3 用户服务…...
从AD9361 到 ADSY1100 ,中间的迭代产品历史
从 AD9361 到 ADSY1100 的演进,是 Analog Devices(ADI)在射频收发器(RF Transceiver)集成化、高性能、宽带宽、低功耗和波束赋形能力方面持续推进的一个路线。以下是其中的重要芯片节点和核心参数对比: 1. …...

免费插件集-illustrator插件-Ai插件-查找选中颜色与pantone中匹配颜色
文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,实现查找选中颜色与pantone中匹配颜色。首先从下载网址下载这款插件https://download.csdn.net/download/m0_6731…...
redis集合类型
练习命令使用,具体如下: 练习无序集合类型命令 sadd smembers scard srem sinter sunion sdiff sismember srandmember spop 练习有序集合类型命令 无序集合中的每个元素都是不同的,且没有顺序 创建/追加/删除/查看 127.0.0.1:6379>…...

[爬虫实战] 爬微博图片:xpath的具体运用
博客配套代码发布于github:微博图片 相关知识点:图片懒加载 [爬虫知识] 数据解析 相关爬虫专栏:JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 这里我们以网页微博图片为例,尝试获取该页面下所有图片并保存。 一、分析网站 刷…...

MySQL中简单的操作
一.数据库 1.1数据库的建立: create database 库名; 1.2数据库的查看: show databases; 1.3数据库的删除: drop database 库名; 二.数据库中的表 2.1表的建立: create table 表名&…...
NNG和DDS
NNG (Nanomsg Next Generation) 和 DDS (Data Distribution Service) 是两种不同的通信协议,各自在不同场景下具有其优势。下面我将对这两种技术进行详细解释,并通过具体的例子来说明它们如何应用在实际场景中。 1. NNG (Nanomsg Next Generation) NNG简…...

防震基座在半导体晶圆制造设备抛光机详细应用案例-江苏泊苏系统集成有限公司
在半导体制造领域,晶圆抛光作为关键工序,对设备稳定性要求近乎苛刻。哪怕极其细微的振动,都可能对晶圆表面质量产生严重影响,进而左右芯片制造的成败。以下为您呈现一个防震基座在半导体晶圆制造设备抛光机上的经典应用案例。 企…...
框架开发与原生开发的权衡:React案例分析(原生JavaScript)
文章目录 框架开发与原生开发的权衡:React案例分析引言框架开发的优势开发效率提升状态管理的便捷性组件复用与生态系统团队协作与规范统一 原生开发的优势性能优化空间学习曲线平缓精细控制与定制化避免版本依赖与迁移成本 实际应用案例分析大型企业应用性能关键型…...

Lua5.4.2常用API整理记录
一、基础函数 1.type(value) 返回值的类型(如 "nil", "number", "string", "table", "function" 等)。 代码测试: a 0 print(type(a)) a nil print(type(a)) a "aaaaaaaa&…...

Python打卡训练营学习记录Day36
仔细回顾一下神经网络到目前的内容,没跟上进度的同学补一下进度。 作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。 import pandas as pd #用于数据处理和分析,可处理表格数…...
### Mac电脑推送文件至Gitee仓库步骤详解
**核心流程及命令说明:** #### 1. **配置全局Git用户信息** bash git config --global user.name "shenguanling" git config --global user.email "3259125968qq.com" - **作用**:设置提交代码时的作者信息࿰…...
官方SDK停更后的选择:开源维护的Bugly Unity SDK
腾讯Bugly,为移动开发者提供专业的异常上报和运营统计,帮助开发者快速发现并解决异常,同时掌握产品运营动态,及时跟进用户反馈。 但是,免费版的Unity SDK已经很久不更新了,会有一些问题和特性缺失ÿ…...

什么是智能体agent?
文章目录 什么是智能体agent?最基本的核心思想我们是如何走到今天以及为什么是现在如何从思维上剖析“一个智能体系统”痛苦的教训结论 什么是智能体agent? 原文链接:https://windsurf.com/blog/what-is-an-agent 本文探讨了AI智能体的核心概…...
【多线程】Java 实现方式及其优缺点
以下是 Java 多线程实现方式及其优缺点的详细说明: 一、Java 多线程核心实现方式 1. 继承 Thread 类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("Thread running: " Thread.currentThread().getName());}…...

Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统
Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统 一、核心架构解析 本系统基于 Obsidian 的 DataviewJS 和 Charts 插件,实现日报数据的自动采集、可视化分析及智能回溯功能(系统架构原理见)。其技术…...
Three.js 海量模型加载性能优化指南
一、性能瓶颈分析 1.1 常见性能杀手 问题类型典型表现影响范围Draw Call 爆炸每帧渲染调用超过1000次GPU 渲染性能内存占用过高浏览器进程内存突破1GB加载速度/崩溃风险模型文件过大单个GLB文件超过50MB网络传输时间几何数据冗余重复模型独立加载CPU/GPU资源浪费 1.2 性能监…...

6.4.3_有向无环图描述表达式
有向无环图: 有向图中不存在环即为有向无环图DAG图,即如下V0->V4->v3->V0或者V4->V1->v4就存在环不是有向无环图,即在一个路径中一个顶点不能出现2次? DAG描述表达式: 算术表达式用树来表示࿰…...
力扣第157场双周赛
1. 最大质数子字符串之和 给定一个字符串 s,找出可以由其 子字符串 组成的 3个最大的不同质数 的和。 返回这些质数的 总和 ,如果少于 3 个不同的质数,则返回 所有 不同质数的和。 质数是大于 1 且只有两个因数的自然数:1和它本身…...
青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布
青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布 一、准备工作1. 创建和配置项目2. 编写代码和测试3. 文档注释 二、构建发布版本1. 构建优化后的可执行文件2. 静态链接(可选) 三、发布到 crates.io1. Crates.io核心功能使用方法特点最新动态 2…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)
目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…...
LLaMA-Factory 微调模型与训练数据量对应关系
在使用LLaMA-Factory的LoRA技术微调1.5B和7B模型时,数据量需求主要取决于任务类型、数据质量以及模型规模。以下是基于现有研究和实践的具体分析: 一、数据量需求的核心影响因素 模型规模与数据量的关系 通常情况下,模型参数越多(…...
数据库与Redis数据一致性解决方案
在写数据时保证 Redis 和数据库数据一致,可采用以下方案,需根据业务场景权衡选择: 1. 先更新数据库,再更新 Redis 步骤: 写入 / 更新数据库数据。删除或更新 Redis 缓存。适用场景:读多写少,对缓存一致性要求不高(短暂不一致可接受)。风险:若第二步失败,导致缓存与…...

Spring Boot AI 之 Chat Client API 使用大全
ChatClient提供了一套流畅的API用于与AI模型交互,同时支持同步和流式两种编程模型。 流畅API包含构建Prompt组成元素的方法,这些Prompt将作为输入传递给AI模型。从API角度来看,Prompt由一系列消息组成,其中包含指导AI模型输出和行为的指令文本。 AI模型主要处理两类消息: …...