[Qt]Qt框架解析:从入门到精通,探索平台开发的无限可能

一、Qt的概述

        Qt是一个跨平台的C++图形用户界面应用程序框架(GUI)。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。开发环境为Qt creator5.8.0,下载网址:http://download.qt.io/archive/qt/

二、创建工程

1、准备工作

(1)点击工具中选项

(2)设置编码格式为UTF-8 

2、Qt窗口类型及关系 

三种窗口QWidget、QMainWindow、QDialog之间的关系:

 3、创建Qt工程

 用代码做ui选项:

工程文件:

widget.h头文件:

 main主函数文件解释:

 widget.cpp

 4、设计Qt工程

(1)窗口

        在主窗口及父类中有相应函数(在Qt助手中查看),通过调用它们实现窗口设计。

 

 

 

(2)按钮 

在QpushButton父类QAbstractButton中可以找到修改按钮文本函数

 

 在QAbstractButton父类Qwidget中可以找到设置按钮的父对象函数

 

 三、对象树(对象模型)

        定义: 

        Q0bject是以对象树的形式组织起来的:在创建 QObject 对象时,可以提供一个其父对象,我们创建 的这个 QObject 对象会自动 添加到其父对象的 children()列表

        当父对象析构的时候,这个列表中的所有对象也会 被析构。(注:这里的父对象并不是继承意义上的父类) 

        补充: 

        QWidget 继承自 QObject,因此也继承了这种对象树关系。一个孩子自 动地成为父组件 的一个子组件

        我们可以自己删除子对象,它们会自动从其父对象列表中删除

        所有的控件 尽量在 堆区创建

 四、坐标体系

        以左上角为原点(0,0),X 向右增加,Y 向下增加

五、信号和槽机制

1、概述

        所谓信号槽,类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。

例子说明:

2、系统的信号和槽 

查找QPushButton的信号Signal:


 在QWidget中查找槽函数:

构造代码: 

3、自定义信号和槽函数

添加两个自定义类

定义信号:在关键字signals下实现 

定义槽函数:在关键字public slots下实现 

 发出信号槽函数:

构造函数:

 运行结果:当点击下课按钮发出信号时时,相应槽函数响应,debug输出。

 4、自定义信号和槽之间的有参传递 

 Qt5方式构造:

Qt4方式构造:

运行结果:

 5、信号和槽的注意事项

信号和槽函数返回值是void        

信号只需要声明,不需要实现。槽函数需要声明也需要实现

使用emit在恰当的位置发送信号

一个信号 可以连接 多个槽         多个信号 可以连接 一个槽

disconnect关键字可以断开信号和槽的连接

槽函数的参数 要小于等于 信号的参数个数。

 六、lambda表达式

        Lambda表达式用于定义并创建匿名的函数对象,巧用Lambda表达式可以简化编程工作。

 

七、QMainWindow窗口 

        QMainWindow是一个为用户提供主窗口程序的类,包含菜单栏(menu bar)。
 

1、创建菜单栏并添加

    //创建菜单栏
    QMenuBar *menubar=new QMenuBar(this);
    //将菜单栏添加到主窗口指定位置
    this->setMenuBar(menubar);

2、 创建菜单并添加

    //创建菜单
    QMenu *File=new QMenu("文件",this);
    QMenu *Edit=new QMenu("编辑",this);
    //将菜单添加到菜单栏
    menubar->addMenu(File);
    menubar->addMenu(Edit);

3、创建菜单项并添加

    //创建菜单项
    QAction *New=new QAction("新建",this);
    QAction *Open=new QAction("打开",this);
    //将菜单项添加到新建菜单
    File->addAction(New);
    File->addAction(Open);
    //批量添加编辑菜单
    Edit->addActions(QList<QAction*>()<<New<<Open);//匿名对象链表模板并输入New和Open

4、菜单项间添加分隔符

 5、建立菜单项信号槽关系

 6、设置菜单项快捷方式

 

7、工具栏QToolBar

        头文件:#include<QToolBar>

 8、状态栏QStatusBar

        头文件#include<QStatusBar>

 9、中心部件

10、铆接部件

        头文件:#include<QDockWidget> 

11、添加资源文件-图标

打开当前工程文件:

在当前工程导入文件:

添加资源文件: 

重新返回资源文件: 

 添加路径前缀:

添加image中图标文件: 

构建资源文件:

 

        给菜单项添加图标         :代表的是资源文件

八、ui文件

        创建窗口时勾选创建界面即生成ui文件

双击进入ui界面: 

改变按钮字体背景:

  

界面编辑:

建立信号与lambda表达式关系:返回编写相应代码

建立信号与槽关系:

放入测试代码: 

 添加资源(步骤如前七中11小点)后为“新建”设置图标:

九、对话框

1、概述

        很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。

        Qt中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。QDialog(及其子类,以及所有Qt : : Dialog 类型的类)的对于其parent指针都有额外的解释:如果 parent为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent的中心)。的中心)。

        顶层窗口与非顶层窗口的区别:顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

2、分类

模态对话框:会阻塞同一应用程序中其它窗口的输入

  • 使用QDialog: : exec()实现应用程序级别的模态对话框
  • 使用QDialog: : open()实现窗口级别的模态对话框

非模态对话框:不会阻塞同一应用程序中其它窗口的输入

  • 使用QDialog: : show()实现非模态对话框。

3、消息对话框QMessageBox 

        属于模态对话框,用于显示信息、询问问题等。

        头文件:#include<QMessageBox>

错误对话框:当点击消息对话框时弹出错误信息,此时不能在主窗口操作--模态对话框

信息对话框: 

 询问对话框:

4、文件对话框QFileDialog 

        头文件:#include<QFileDialog>

 5、颜色对话框QColorDialog

        头文件#include<QColorDialog>

6、字体对话框QFontDialog

 头文件:#include<QFontDialog>

十、布局管理 

Qt 提供的布局中最常用的三种:

  • QHBoxLayout:按照水平方向从左到右布局;
  • QVBoxLayout:按照竖直方向从上到下布局;
  • QGridLayout:在一个网格中进行布局,类似于 HTML 的 table 

新建wdiget工程随意放置三个按钮: 

 1、水平布局QHBoxLayout

 2、垂直布局QVBoxLayout

 3、栅格/网格局QGridLayout

十一、登录器

1、界面布局设计

2、设置输入框的密码模式

3、获取输入框的内容

QString usr=ui->lineEdituser->text();
QString pwd=ui->lineEditpwd->text();

4、设置输入框的内容

ui->lineEdituser->setText("");
ui->lineEdituser->setText("");

5、创建登录后页面 

6、跳转到新页面 

7、设计从新页面 回到 主页面功能

 十二、常用控件

1、Qlabel标签

        用于显示文本、显示图片、显示动画。

(1)显示文本

设计界面,按钮转到槽函数后编写相关代码实现文本修改:

点击修改文本按钮后文本改变 

(2)显示图片

 

(3)显示动画 

 2、单选框QRadioButton

 

3、复选框QCheckBox 

        头文件:#include<QCheckBox>

状态改变信号: 

三种state状态: 

 

4、下拉列表框QComboBox

        头文件:#include<QComboBox>

 5、列表控件QListWidget

 

6、树控件QTreeWidget 

 

 7、表格控件QTableWidget

 

 8、工具盒容器QToolBox

 

9、tab widget容器 

10、stacked Widget栈容器(局部更新页面)

初始默认只有两个页面,再添加一个页面:

 添加三个新的ui界面用于显示在栈容器不同页面:

在新的ui中利用QLabel添加相应图片: 

在相应页分别做提升: 

 在widget.cpp中建立信号与槽机制:

11、自定义控件

(1)定义

        在一个项目中很多窗口,或者是窗口中的某个模块会被经常性的重复使用。一般遇到这种情况我们都会将这个窗口或者模块拿出来,做成一个独立的窗口类,即自定义控件,以备以后重复使用。

(2)创建自定义控件

添加新的窗口制作自定义控件:



 

利用容器将自定义控件放入主窗口:

 

 运行结果:

(3)建立信号与槽机制

 

在myWidget构造函数中实现: 

(4)自定义控件提供接口 

 

 十三、Qt的事件

1、概述

        事件(event)是由系统或者Qt本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

        Qt中所有事件类都继承于QEvent,event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数。



创建Widget窗口并编辑窗口:

添加新文件MyLabel继承QLabel(用于重写事件函数): 

 

2、重写鼠标事件 

 

 

对QLabel做提升:

 

 3、参数QMouseEvent *ev和鼠标追踪

查看button的返回值:

 

 

 4、事件分发器

        event()函数主要用于事件的分发。所以,如果你希望在事件分发之 前做一些操作,就可以 重写这个 event()函数。

         如果传入事件分发器的事件已被识别并且处理,则需要返回 true,否则返回false.。如果返回值是 true,那么 Qt 会认为这个事件已经处理完毕,不会再将这 个事件发送给其 它对象,而是会继续处理事件队列中的下一事件。

 

 5、事件过滤器

 在mylabel构造函数中安装事件过滤器:

 头文件重写事件过滤器:

 在mylabel.cpp中实现:

 十四、定时器

 1、定时器事件 触发定时

 启动定时器函数:

创建新的widget工程并添加两个label控件:

2、定时器对象 触发定时(可控) 

添加如下控件: 

 头文件:#include<QTimer>

 3、定时器静态函数 (触发定时)(延时启动一次)

 编辑ui如下:

在widget.cpp中编写延时代码并运行: 

 

十五、Qt绘制背景图片

1、概述 

        Qt的绘图系统允许使用相同的 API在屏幕和其它打印设备上进行绘制。整个图系统基于QPainterQPainterDeviceQPaintEngine三个类。

  • QPainter用来执行绘制的操作;
  • QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter 工作的空间;
  • QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口

三个类之间的关系:

2、绘制背景图片 

在窗口上 绘制图片需要重载widget的绘图事件:

void QWidget::paintEvent(QPaintEvent *event);

 窗口加载、update都会调用 paintEvent绘图事件:

 创建新的ui工程并添加重载函数:

添加资源文件:

在widget.cpp中实现:

 3、切换背景图片

添加按钮:

在widget构造函数中利用按钮调用updata函数触发绘图事件:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小红书 2024 大模型论文分享会来啦,与多位顶会作者在线畅聊!

大模型正引领新一轮的研究热潮&#xff0c;业界和学术界都涌现出了众多的创新成果。 小红书技术团队也在这一浪潮中不断探索&#xff0c;多篇论文研究成果在 ICLR、ACL、CVPR、AAAI、SIGIR、WWW 等国际顶会上频频亮相。 在大模型与自然语言处理的交汇处&#xff0c;我们发现了…

无需科学上网:轻松实现国内使用Coze.com平台自己创建的Bot(如何实现国内免费使用GPT-4o/Gemini等最新大模型)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 如何在国内使用 Coze.com 创建的 Bot 📒📝 创建Bot📝 实现国内使用📝 测试⚓️ 相关链接 ⚓️📖 介绍 📖 Coze.com 是一个强大的平台,允许用户创建各种类型的 Bot。然而,许多国内用户可能会遇到访问问题,导致无法…

【读论文】Learning perturbations to explain time series predictions

文章目录 Abstract1. Introduction2. Background Work3. Method4. Experiments4.1 Hidden Markov model experiment4.2 MIMIC-III experiment 5. ConclusionReferences 论文地址&#xff1a;Learning Perturbations to Explain Time Series Predictions代码地址&#xff1a;htt…

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据&#xff0c;并打印 2、客户端…

linux分区

挂载只改变数据存储的分区位置&#xff0c;不改变文件系统的目录结构&#xff0c;无论怎么挂载linux系统的分区仍然是/根分区和其子目录/opt、/etc、/home等等 临时挂载 添加新磁盘模拟新设备接入&#xff0c;无论使用什么虚拟机都可以 重启电脑reboot&#xff0c;执行lsblk&a…

Vitis Accelerated Libraries 学习笔记--Vision 库介绍

目录 1. 简介 2. 分类介绍 2.1 图像容器 2.2 图像处理基础 2.3 图像滤波和平滑 2.4 图像变换和增强 2.5 图像分析和特征检测 2.6 数学和算术操作 2.7 图像校正和优化 2.8 颜色和阈值处理 2.9 高级图像处理 2.10 光流和运动估计 2.11 图像转换和映射 2.12 其他特殊…

Docker容器基础知识,即linux日常运维命令

Docker 是一个流行的用 Go 语言开发的开源项目&#xff0c;基于Linux内核的cgroup、namespace及 AUFS 等技术&#xff0c;对进程进行封装隔离&#xff0c;由 Dotcloud 公司开发。Docker已成为容器行业的事实标准。 小陈发现一个有趣的事情&#xff0c;容器的英文是Container&am…

Python 修炼|人人编程手册|001 计算思维

在微信中阅读,关注公众号:CodeFit。 > 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创作 提供 动力! 1. 计算思维 在我们正式开启 Python 修炼之旅前,先来了解一个关键的概念 —— 计算思维。 计算思维,其核心本质在于 抽象 …

【MATLAB源码-第229期】基于matlab的有源功率因数校正仿真,采用PI调节改善功率因数;改善后达到99%.

操作环境&#xff1a; MATLAB 2022a 1、算法描述 一、整体结构概述 有源功率因数校正&#xff08;APFC&#xff09;是一种用于提高电力系统功率因数的技术&#xff0c;通过控制电流的波形&#xff0c;使其与电压的波形保持一致&#xff0c;从而减少无功功率的产生&#xff…

[【机器学习】深度概率模型(DPM)原理和文本分类实践

1.引言 1.1.DPM模型简介 深度概率模型&#xff08;Deep Probabilistic Models&#xff09; 是结合了深度学习和概率论的一类模型。这类模型通过使用深度学习架构&#xff08;如神经网络&#xff09;来构建复杂的概率分布&#xff0c;从而能够处理不确定性并进行预测。深度概率…

【C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承的二义性和数据冗余问题

继承&#xff08;上&#xff09;&#xff1a;【C进阶学习】第一弹——继承&#xff08;上&#xff09;——探索代码复用的乐趣-CSDN博客 继承&#xff08;下&#xff09;&#xff1a;【C进阶学习】第二弹——继承&#xff08;下&#xff09;——挖掘继承深处的奥秘-CSDN博客 …

大数据经典sql

一、连续登录问题 问题&#xff1a;1&#xff09;、每个用户连续登录最大天数 2&#xff09;、连续登录大于三天的用户数 分析&#xff1a;本质都是计算用户连续登录天数 方案一&#xff1a;利用排序窗口 select a.user_id,a.date_rslt,count(1) as cnt from (select t.…

艺术创作加速器:三款AI绘画软件,让你的工作效率倍增!

在数字化浪潮的推动下&#xff0c;艺术创作正迎来革命性的变化。AI绘画软件的出现&#xff0c;不仅为艺术家提供了全新的创作工具&#xff0c;也为艺术爱好者开辟了一片创意的新天地。这些软件利用人工智能技术&#xff0c;根据用户的简单描述或草图&#xff0c;快速生成独特的…

旋转式滚珠花键在自动装载机中的作用!

自动装载机是一种广泛用于公路、铁路、建筑、水电、港口、矿山等建设工程的土石方施工机械&#xff0c;是工程建设中土石方施工的主要机种之一。而旋转式滚珠花键作为自动装载机中重要的传动元件&#xff0c;在自动装载机的运用起着重要的作用。 自动装载机主要用于铲装土壤、砂…

常见的结构型设计模式

设计模式&#xff08;二&#xff09; 常见的结构型模式 1.代理模式: 提供一种代理方法 &#xff0c;来控制对其他对象的访问。在有些情况下&#xff0c;一个对象不能或者不适合直接访问另一个对象&#xff0c;而代理对象可以在这两个类之间起一个中介的作用。 举例&#xf…

Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选

Solana Sol跟单机器人&#x1f916; SOL跟单机器人&#xff08;Copy Trading Bot&#xff09;是一种自动化交易工具&#xff0c;允许用户复制其他成功交易者的交易行为。这种机器人通常用于加密货币市场、外汇市场等金融市场。以下是SOL跟单机器人的一些关键特性和功能&#xf…

yolov10--C#接口

一、前言 本章主要讲解yolov10的C#接口&#xff0c;主要是使用微软开发的openvinocsharp工具加载yolov10模型&#xff0c;并做推理。 二、yolov10模型转换 这里为了演示&#xff0c;使用官方yolov10m模型&#xff08;其他大小的模型同理&#xff09;做演示&#xff0c;可从下方…

iptables(5)常用扩展模块

简介 之前我们已经介绍过扩展模块的简单使用,比如使用-m tcp/udp ,-m multiport参数通过--dports,--sports可以设置连续和非连续的端口范围。那么我们如何匹配其他的一些参数呢,比如源地址范围,目的地址范围,时间范围等,这就是我们这篇文章介绍的内容。 iprange扩展模块…

Ubuntu系统下修改网卡IP地址

Ubuntu系统下修改网卡IP地址 一、Ubuntu系统介绍1.1 Ubuntu简介1.2 Ubuntu网络配置方式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、配置网卡IP地址4.1 备份网卡配置文件4.2 查看当前IP地址4.3 修改…

0.15元1.5Mhz-1.3A同步整流BUCK降压DCDC芯片MT3410(MT3410LB)

前言 国产同步整流DCDC&#xff0c;参考价格约0.15元。 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 1.3A 输出电流 无需肖特基二极管 2.3V至7V输入电压范围 输出电压低至 0.6V PFM 模式可在轻负载下实现高效率 压差操作中的100%占空比 低静态电流&#xff1a;35μ…