Qt 入门学习路线

【QT学习】学习路线 通过以上步骤的学习和实践,你将能够逐步掌握Qt框架的使用,并开发出高质量的跨平台应用程序。 阅读详情
AI摘要

本文深入介绍了Qt框架,包括其跨平台性、信号槽机制、对象树和在线帮助系统。通过一个电子表格应用的实战案例,展示了如何使用Qt进行GUI编程,涉及文件操作、表格交互、搜索及跳转功能。此外,文章还提供了详细的代码分析,涵盖了文件读写、菜单创建、单元格操作等关键功能。

知识点


设计模式

  • 创建型模式
  • 结构型模式
  • 行为模式

C++

  • 指针和引用

STL

  • 容器
  • 迭代器
  • 算法
  • 仿函数
  • 适配器
  • 空间配置器

智能指针

  • unique_ptr
  • shared_ptr

Qt

  • 元对象系统

    • QObject基类
    • Q_OBJECT()宏
    • moc元对象编译器
  • 信号与槽机制

    • 原理:signals/slots - staticMetaObject - connect - 存放至map - emit触发 - active函数
    • 优点:
    • 缺点:
  • QThread

  • QTcpServer

  • QTcpSocket


一、Qt框架概述


1. 什么是Qt?

Qt是一个用C++编写的、成熟的、跨平台的GUI工具包,它是挪威Trolltech公司的产品,该公司为商业市场开发、销售和支持Qt及其相关软件。

Qt作为一个出色的软件框架,除了为应用程序提供GUI库,还提供了容器、输入输出、数据库、多线程、网络、三维图形等开发工具,十分强大。

Qt除了价格高昂的商用版本,还对自由软件社区提供了免费开源版本。

2. Qt的优点

  • 跨平台
    Qt的第一大优点,也是最令人印象深刻的特点就是它的跨平台性。
    Qt支持Linux、类UNIX系统、Windows、Mac OS、甚至嵌入式平台。
    Qt对于每一种操作系统平台,都提供了对应的底层类库,也就是在OS层和应用层之间增加了一个“平台适应层”,而对应用程序提供出来的接口时一致的。所以同样一套代码,不管放在Linux还是Windows,几乎不用改动就可以通过编译,此特性大大方便了软件的移植。

  • 信号槽机制
    信号与信号处理时GUI应用程序用来相应用户输入的主要机制,也是一个GUI库的核心特征。
    Qt的信号处理机制由 信号 和 槽 构成。使用信号槽功能的类需要在类声明中添加 Q_OBJECT 宏声明,然后使用 QObject::connect() 函数进行连接,它明确地将信号和信号处理函数联系了起来。
    在这里插入图片描述

  • Qt对象树
    Qt对象之间是可以存在父子关系的。父对象会保存一个子对象链表,记录所有指向其子对象的指针,同时子对象也会保留指向父对象的指针。当一个父对象被析构时,其子对象也会被析构。
    所以销毁一个对象,它的所有子孙后代对象都会被销毁,表现在Qt对象树上就是删除一个节点,那这个节点下的整个分支都会被删除。这种特性让开发人员在一个对象下new出若干子对象后,不需要手动去delete,只需要销毁一个父对象,它们都会被自动销毁,大大减轻开发人员的负担。

    使用此特性时仍需注意的问题: 对象树和析构函数冲突

  • 在线帮助系统
    由于Qt提供的封住类和接口十分丰富,Qt Creator 在文本编辑器中提供了在线帮助系统,只需要选中要查询的内容,按下F1,即可弹出相应的帮助页面,极大地减少了查询和学习的时间。
    在这里插入图片描述


二、Qt体系


1. Qt模块图

在这里插入图片描述

2. Qt继承树

在这里插入图片描述

3. Qt学习路线图

在这里插入图片描述

三、Qt编程练习


Spreadsheet 制作一个电子表格

项目总览

  • 项目介绍
    该项目会创建一个电子表格,功能类似Excel表格。
    有基本的单元格编辑,复制,剪切,删除等功能。
    有批量复制,搜索,排序等进阶功能。
    有保存文件,打开文件,展示最近文件的功能。

  • 所有文件
    总文件个数17,总代码量约1800行
    在这里插入图片描述

  • 主窗口类 (继承于QMainWindow类)
    mainwindow.h
    mainwindow.cpp
    主窗口类负责管理整体的布局,生成顶部工具栏以及快捷按钮,并且包含了提供核心功能的电子表格。主窗口还负责文件的保存与读取,以及提供第二级功能弹窗。
    在这里插入图片描述

  • 表格类 (继承于QTableWidget类)
    spreadsheet.h
    spreadsheet.cpp
    表格类只生成由单元格组成的空白表格,有CCell单元格类作为私有成员。表格类的主要意义是接收输入(键盘、鼠标)并显示内容,以及提供所有跟表格内容有关的操作,比如拷贝、粘贴和剪切单元格,完成公式的计算,打开文件后的表格显示,从表格中读取数据,搜索数据等等…
    在这里插入图片描述

  • 单元格类 (继承于QTableWidgetItem,能很好地与表格类配合)
    cell.h
    cell.cpp
    单元格类是最小的单元,所有数据最终都要通过它来显示和返回,它主要提供公式设置和解析的功能。
    在这里插入图片描述

  • 搜索对话框类 (继承于QDialog类)
    sortdialog.h
    sortdialog.cpp
    在主窗口的Edit菜单点击Find搜索选项,或者按下快捷栏的Find按钮,都会弹出搜索弹窗。该窗口除了提供基本的搜索功能外,还增加了两个细微的操作来增加搜索的精确性:反向搜索和大小写感。搜索时勾选该选项(CheckBox)即可。只有当输入框中内容满足一定条件,Find按钮才会被激活,这里用到了Qt提供的正则表达式。
    在这里插入图片描述

  • 跳转对话框类 (继承于QDialog类)
    gotocelldialog.ui
    ui_gotocelldialog.h
    gotocelldialog.cpp
    该对话框的作用很简单,跳转到用户指定的单元格(比如A21、H55)。
    (创建此对话框时用到了Qt Designer,因此生成了对应的ui文件)
    在这里插入图片描述
    在这里插入图片描述

  • 排序对话框类 (继承于QDialog类)
    sortdialog.ui
    ui_sortdialog.h
    sortdialog.cpp
    该对话框提供对选中区域的排序功能,所有被选中的列号都会被加载进Column选项,你可以任选一列进行排序,按下more按钮,允许你再选择两列进行排序,这里对more键的toggle信号和后两个设置框的visible属性作了信号槽连接。
    (创建此对话框时用到了Qt Designer,因此生成了对应的ui文件)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

关键代码分析

  • 主窗口功能 - 另存为SaveAs
    以下是SaveAs操作会调用到的三个函数
    在主函数中,SaveAs作为槽函数,在SaveAsAction被触发后调用。此函数调用 QFileDialog类 提供的 getSaveFileName 函数,会弹出一个已封装好的文件保存对话框,可以在参数列表中设置标题、保存类型。
    保存后会返回文件名filename,为了之后交给spreasheet以保存当前数据内容。所以在return处调用saveFile私有函数
bool MainWindow::saveAs()
{
   
   
    QString filename = QFileDialog::
    					getSaveFileName(
    						this,
                        	tr("Save Spreadsheet"),
                            tr("Spreadsheet files (*.sp)"));
    if (filename.isEmpty()) {
   
   
        return false;
    }
    return saveFile(filename);
}

saveFile函数把filename交给spreadsheet,让其把表格中的数据写入,若写入成功,则设置为当前文件并给出提示。

bool MainWindow::saveFile(const QString& filename)
{
   
   
    if (!spreadSheet->writeFile(filename)) {
   
   
        statusBar()->showMessage(tr("Saving canceled"), 2000);
        return false;
    }

    setCurrentFile(filename);
    statusBar()->showMessage(tr("File saved"), 2000);
    return true;
}

在CSpreadSheet类中完成数据写入操作。先用文件名构造一个 QFile 对象,然后调用open打开,若文件打开成功,则以此创建一个 QDataStream 数据流对象。最开始写入的MAGIC_NUMBER用于标识.sp文件,在读取数据的时候需要通过判断文件头来确定是否是sp文件。接着,通过遍历表格,将有公式的行号、列号和公式写入数据流。在此期间,将鼠标设为等待状态图形。

bool CSpreadSheet::writeFile(const QString& filename)
{
   
   
    QFile file(filename);
    if (!file.open(QIODevice::WriteOnly)) {
   
   
        QMessageBox::warning(this, tr("Spreadsheet"),
                             tr("cannot write file %1:\n%2.")
                             .arg(file.fileName())
                             .arg(file.errorString()));
        return false;
    }

    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_5_12);
    out << quint32(MAGIC_NUMBER);

    QApplication::setOverrideCursor(Qt::WaitCursor);
    for (int row = 0; row < rowCount(); ++row) {
   
   
        for (int col = 0; col < columnCount(); ++col) {
   
   
            QString str = formula(row, col);
            if (!str.isEmpty()<
【Qt】Qt6从入门到实战:一站式学习路线与核心模块精讲 本文全面介绍Qt6从入门到实战的学习路线与核心模块,涵盖环境搭建、信号槽新语法、模型/视图框架优化等关键内容。通过实际案例展示Qt6在跨平台开发中的优势,包括性能提升、现代化架构及实用技巧,帮助开发者快速掌握Qt6开发技能。 阅读详情

相关推荐

C++与Qt开发实战:从入门到精通的系统学习路线与项目实践

C++作为一门高性能的系统级编程语言,其核心价值在于对内存和计算资源的极致掌控,结合面向对象与泛型编程范式,能够构建高效、稳定的底层系统。Qt框架基于C++,通过元对象系统和信号槽机制,实现了跨平台的图形用户界面开发,显著提升了桌面与嵌入式应用的开发效率。在工业自动化、金融交易、图形处理等对性能与可靠性要求极高的领域,C++与Qt的组合具有不可替代的技术价值。本文基于【C++开发】与【Qt框架】等核心概念,系统解析了从现代C++语法、Qt核心机制到多线程、模型视图等高级特性的学习路径,并通过【Markdow

weixin_30342363的博客 354

Qt开发学习路线

窗口类(`QWidget`/`QMainWindow`)、按钮(`QPushButton`)、布局管理器(`QHBoxLayout`/`QVBoxLayout`)。- STL容器(`vector`/`map`)、智能指针(`shared_ptr`/`unique_ptr`)。- 功能:通过串口(`QSerialPort`)与硬件通信,实时显示传感器数据(折线图用`QChart`)。- 多线程:`QThread`与`std::thread`的区别、线程同步(`QMutex`)。

2301_80355452的博客 879

Qt C++开发学习路线

Qt C++学习路线

zwandming的博客 3261

C++与Qt企业级桌面应用开发:从入门到实战的完整学习路线

面向对象编程(OOP)是现代软件开发的核心范式,它通过封装、继承和多态等机制构建模块化、可复用的代码结构。其原理在于将数据与操作数据的方法绑定为对象,从而提升代码的组织性和可维护性。在工程实践中,OOP是实现复杂业务逻辑和大型系统架构的基石,尤其在需要高性能和精细资源控制的桌面应用开发领域价值显著。跨平台桌面应用开发正是这一技术价值的典型应用场景,它要求应用能在Windows、macOS和Linux等不同操作系统上提供一致的用户体验和稳定性能。本文聚焦于C++与Qt框架这一黄金组合,深入探讨如何利用其强大的

weixin_29188043的博客 292

Qt入门教程100篇(已完结)

Qt5入门教程,Qt6入门教程。包含了: Qt环境搭建篇、Qt数据类型篇、Qt中STL篇、Qt核心篇、Qt核心对象QObject篇、Qt基础控件篇、Qt对话框篇、Qt高级控件篇、Qt数据模型篇、QSS篇、Qt文件篇 、Qt硬件编程、Qt的一些demo、Qt项目开发篇。......

小鱼酱的博客 15万+

QT_快速入门

*信号与槽(Signal & Slot)**是QT⾃⾏定义的⼀种通信机制,也是 Qt 编程的基础。通过信号与槽的编程机制,使得 Qt 中处理界⾯各个组件的交互操作时变得更加直观和简单。它独⽴于标准的C/C++语⾔,因此要正确的处理信号和槽,必须借助⼀个称为moc(Meta Object Compiler)的QT⼯具,该⼯具是⼀个C++预处理程序,它为⾼层次的事件处理⾃动⽣成所需要的附加代码。信号(signal):就是特定情况下被发射的事件,⼀般由对象或空间发射出去的消息。

Three的笔记 8861

Qt开发者必看:QTimer::singleShot的5个实战避坑指南(含lambda和多线程案例)

本文为Qt开发者提供了QTimer::singleShot的5个关键实战避坑指南,涵盖lambda捕获、对象生命周期和多线程安全等核心难点。通过对比错误与正确代码示例,深入解析了如何避免悬空指针、确保线程执行上下文正确以及管理定时任务资源,帮助开发者编写更健壮、可靠的延迟执行代码。

stem5的博客 466

C语言实现定时任务

例:设置定时任务,每周周X的X时X分自动重启系统 思路:将设置好的重启时间保存到本地配置文件中,设置定时器定时一分钟,每一分钟信号触发一次事件,事件函数中获取配置文件信息与当前系统时间信息,将两个时间进行时间差计算,符合条件的自动重启系统. //创建定时器函数(通过信号触发事件timer_task函数启动) int create_timer() { struct sigevent evp; int ret = 0; memset(&evp, 0, sizeof(stru

佳佳鸽的博客 5036

Xilinx UltraScale+ FPGA实战:手把手教你实现USB3.0设备开发(附原理图+代码)

本文详细介绍了如何使用Xilinx UltraScale+ FPGA开发USB3.0设备,涵盖硬件设计、Vivado工程配置、Petalinux系统定制及功能测试全流程。通过实战案例和优化技巧,帮助开发者快速掌握高速数据传输实现方法,提升嵌入式系统开发效率。

weixin_29159995的博客 209

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

ESP-IDF 5.4下esp32-camera组件编译报错?手把手教你解决头文件缺失问题

本文详细解析了ESP-IDF 5.4环境下esp32-camera组件编译时出现的头文件缺失问题,提供了从目录结构优化、CMake配置到VSCode智能感知设置的完整解决方案。针对第三方组件集成难题,文章特别强调了PRIV_REQUIRES依赖声明和路径配置的关键作用,帮助开发者高效解决编译错误并建立稳定的开发环境。

weixin_28829629的博客 307

TenserRt平台SMOKE 3D目标检测部署完整教程:从理论到实践

本教程详细介绍了在RK3588平台上部署SMOKE 3D目标检测模型的完整流程。SMOKE是一种创新的单阶段单目3D检测方法,通过关键点估计直接预测3D目标信息,有效解决了深度信息缺失等挑战。文章从理论基础出发,解析了SMOKE的核心算法和网络架构,包括DLA-34主干网络和关键点中心化策略。同时提供了详细的Docker环境配置、模型导出到ONNX格式的实践指南,以及TensorRT引擎构建和性能优化的关键技术要点。该教程为开发者在嵌入式平台上实现高效3D目标检测提供了完整的技术参考。

LXY_LOVE36的博客 371

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 281

Python 爬虫实战:爬取去哪儿网酒店评价,提取住宿体验关键词

本文介绍了基于去哪儿网酒店评价数据的爬取与分析方法。首先通过分析网页结构和数据加载机制,定位到评价数据的JSON接口及关键参数。然后使用Python搭建爬虫环境,实现多页评价数据的批量采集与存储,并通过反爬策略确保数据获取的稳定性。在文本分析环节,采用jieba分词和TF-IDF算法提取高频关键词,结合词云可视化展示用户关注点。分析结果显示位置、服务、卫生是核心关注维度,同时识别出好评与差评的关键驱动因素。该方法为酒店服务优化和消费者决策提供了数据支持,并可通过扩展实现更深入的情感分析和竞品对比。

2503_91057718的博客 999

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: NTP时间同步指南 Linux(Ubuntu) / Windows
下一篇: Qt Cmake编译Qt程序 信号函数报错 undefined reference to
wyk023
博客等级 码龄11年 104粉丝 14原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值