QT6安装与概念介绍

news2025/5/30 13:04:14

文章目录

  • 前言
  • 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 qtbase

WARNING: 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 found

sudo apt-get install -y \
    libdrm-dev \
    libxcomposite-dev \
    libxcursor-dev \
    libxrandr-dev \
    libxi-dev \
    libxshmfence-dev \
    libxtst-dev \
    libxkbcommon-dev \
    libxkbfile-dev

sudo 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-core


sudo 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的元对象系统提供了信号和槽机制,用于对象间通讯,运行时类型信息和动态属性系统。

  1. QObject类为对象提供获取元对象系统优势的基类
  2. Q_OBJECT宏用于确保元对象特性,如动态属性、信号和槽
  3. 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 macro
    Q_OBJECT
    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)

public:
    MyClass(QObject *parent = nullptr);
    ~MyClass();

    enum Priority { High, Low, VeryHigh, VeryLow };
    // moc gramma
    Q_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,然后从父对象中移除它,最后析构window

int 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() == 12
    b.setValue(48);     // a.value() == 12, b.value() == 48
    printf("%d, %d\n", a.value(), b.value());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker(二):开机自启动与基础配置、镜像加速器优化与疑难排查指南

引言 docker 的快速部署与高效运行依赖于两大核心环节&#xff1a;基础环境搭建与镜像生态优化。本期博文从零开始&#xff0c;系统讲解 docker 服务的管理配置与镜像加速实践。第一部分聚焦 docker 服务的安装、权限控制与自启动设置&#xff0c;确保环境稳定可用&#xff1b…

Lua基础语法

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

2025年渗透测试面试题总结-匿名[实习]安全工程师(安全厂商)(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一面技术问题 1. Burp插件原理 2. JavaWeb项目经验 3. CC1-7链原理&#xff08;以CC6为例&#xff0…

【node.js】实战项目

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. 项目概览与架构设计1.1 实战项目&#xff1a;企业级电商管理系统1.2 技术栈选择 2. 项目初始化与基础架构2.1 项目结构设计2.2 基础配置管理 3. 用户服务实现3.1 用户服务架构3.2 用户模型设计3.3 用户服务…

免费插件集-illustrator插件-Ai插件-查找选中颜色与pantone中匹配颜色

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现查找选中颜色与pantone中匹配颜色。首先从下载网址下载这款插件https://download.csdn.net/download/m0_6731…

[爬虫实战] 爬微博图片:xpath的具体运用

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

MySQL中简单的操作

一.数据库 1.1数据库的建立&#xff1a; create database 库名&#xff1b; 1.2数据库的查看&#xff1a; show databases&#xff1b; 1.3数据库的删除&#xff1a; drop database 库名&#xff1b; 二.数据库中的表 2.1表的建立&#xff1a; create table 表名&…

防震基座在半导体晶圆制造设备抛光机详细应用案例-江苏泊苏系统集成有限公司

在半导体制造领域&#xff0c;晶圆抛光作为关键工序&#xff0c;对设备稳定性要求近乎苛刻。哪怕极其细微的振动&#xff0c;都可能对晶圆表面质量产生严重影响&#xff0c;进而左右芯片制造的成败。以下为您呈现一个防震基座在半导体晶圆制造设备抛光机上的经典应用案例。 企…

Lua5.4.2常用API整理记录

一、基础函数 1.type(value)​​ 返回值的类型&#xff08;如 "nil", "number", "string", "table", "function" 等&#xff09;。 代码测试&#xff1a; a 0 print(type(a)) a nil print(type(a)) a "aaaaaaaa&…

Python打卡训练营学习记录Day36

仔细回顾一下神经网络到目前的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a;对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。 import pandas as pd #用于数据处理和分析&#xff0c;可处理表格数…

什么是智能体agent?

文章目录 什么是智能体agent&#xff1f;最基本的核心思想我们是如何走到今天以及为什么是现在如何从思维上剖析“一个智能体系统”痛苦的教训结论 什么是智能体agent&#xff1f; 原文链接&#xff1a;https://windsurf.com/blog/what-is-an-agent 本文探讨了AI智能体的核心概…

Obsidian 数据可视化深度实践:用 DataviewJS 与 Charts 插件构建智能日报系统

Obsidian 数据可视化深度实践&#xff1a;用 DataviewJS 与 Charts 插件构建智能日报系统 一、核心架构解析 本系统基于 Obsidian 的 DataviewJS 和 Charts 插件&#xff0c;实现日报数据的自动采集、可视化分析及智能回溯功能&#xff08;系统架构原理见&#xff09;。其技术…

6.4.3_有向无环图描述表达式

有向无环图&#xff1a; 有向图中不存在环即为有向无环图DAG图&#xff0c;即如下V0->V4->v3->V0或者V4->V1->v4就存在环不是有向无环图&#xff0c;即在一个路径中一个顶点不能出现2次&#xff1f; DAG描述表达式&#xff1a; 算术表达式用树来表示&#xff0…

【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)

目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…

Spring Boot AI 之 Chat Client API 使用大全

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

分身空间:手机分身多开工具,轻松实现多账号登录

分身空间是一款功能强大的手机分身多开工具APP&#xff0c;专为需要同时登录多个账号的用户设计。它支持多开各种游戏和软件&#xff0c;让用户可以轻松实现多账号同时在线&#xff0c;提升使用效率和体验。无论是社交软件、游戏还是办公应用&#xff0c;分身空间都能帮助你轻松…

音视频之视频压缩及数字视频基础概念

系列文章&#xff1a; 1、音视频之视频压缩技术及数字视频综述 一、视频压缩编码技术综述&#xff1a; 1、信息化与视频通信&#xff1a; 什么是信息&#xff1a; 众所周知&#xff0c;人类社会的三大支柱是物质、能量和信息。具体而言&#xff0c;农业现代化的支柱是物质&…

Ubuntu 24.04部署安装Honeyd蜜罐

&#x1f334; 前言 最近有个大作业&#xff0c;里面要求我们部署Hoenyd蜜罐&#xff0c;在网上搜了一通&#xff0c;发现相关的教程竟然少的可怜&#xff0c;即使有比较详细的教程&#xff0c;也是好几年前的了&#xff0c;跟着做一遍报一堆错&#xff0c;无奈之下&#xff0…

MCP技术体系介绍

MCP,全称时Model Context Protocol,模型上下文协议,由Claude母公司Anthropic于2014年11月正式提出。 MCP的核心作用是统一了Agent开发过程中大模型调用外部工具的技术实现流程,从而大幅提高Agent的开发效率。在MCP诞生之前,不同外部工具各有不同的调用方法。 要连接这些…

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南 一、创建隔离开发环境 1. 使用虚拟环境&#xff08;推荐venv&#xff09; # 在项目目录打开终端执行 python -m venv douban_env # 创建虚拟环境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…