[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函数触发绘图事件:

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

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

相关文章

项目经验——交通行业数据可视化大屏、HMI设计

交通行业数据大屏、HMI设计时要的注意点&#xff1a;清晰可读、简洁直观、适配性强。颜色对比度满足WCAG标准&#xff0c;深色背景减少干扰&#xff0c;实时展示交通数据&#xff0c;支持有线网络控制内容更新&#xff0c;保障驾驶安全与决策效率。

通过“BOSS”精通比特币,深入认识私钥、账户和钱包

来源:币界原创 作者:636Marx 无论当今数字货币技术如何发展&#xff0c;认识区块链技术幕后的关键机制至关重要。无论您是新手还是经验丰富的数字货币从业者&#xff0c;掌握钱包地址、公钥和私钥的复杂性都有无可替代重要性。进入 BOSS Wallet&#xff0c;这是一款尖端的 Web…

ICMAN触摸芯片——防水触摸

ICMAN触摸芯片之防水触摸触摸按键控制开关和调节挡位和切换不同模式 淋水状态下&#xff0c;触摸按键反应灵敏&#xff0c;不误触发&#xff0c; ICMAN触摸芯片稳定性与抗干扰能力强&#xff0c; 可以轻松解决家电触摸感应不灵敏和有水误触发的问题&#xff0c; 从而有效实…

Linux_文件IO

目录 一、库函数进行文件操作 1、fopen/fclose 2、fwrite 3、追加方式-“a” 4、fread 5、三个默认文件流 二、系统函数进行文件操作 1、open/close 2、write 3、追加方式-“O_APPEND” 4、read 5、struct file结构体 6、文件描述符 6.1 struct file的引用…

中学理化生实验室建设及配置要求

在中学物理、化学、生物等学科教学中&#xff0c;实验占据了非常重要的地位&#xff0c;是整个教学过程中不可或缺的部分。很多理科教学需要在实验室完成演示和学习任务&#xff0c;实验室也是保证教学计划得以实施的物质基础。因此&#xff0c;中学理化生实验室建设标准与否&a…

【C++ | const成员】类的 const数据成员、const成员函数、const对象、mutable 数据成员

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-14 2…

win10修改远程桌面端口号,在Windows 10中修改远程桌面端口号的步骤

在Windows 10中&#xff0c;远程桌面服务&#xff08;Remote Desktop Services, RDS&#xff09;允许用户从远程位置访问和操作计算机。默认情况下&#xff0c;远程桌面协议&#xff08;RDP&#xff09;使用端口3389进行通信。然而&#xff0c;出于安全考虑&#xff0c;管理员可…

VScode创建ROS项目 ROS集成开发环境

ROS使用VScode创建项目步骤 1.创建ROS工作空间2.启动VScode3.VScode编译ROS4.创建ROS功能包C语言开发Python语言开发 本文章介绍了如何在Ubuntu18.04系统下搭建VScode 的ROS项目 搭建项目分为一下几个步骤&#xff1a; 1.创建ROS工作空间 创建一个demo的ROS工作空间&#xff0…

大数据学习-Hadoop

介绍 是 Apache 的顶级开源项目&#xff0c;一个分布式框架&#xff0c;主要功能&#xff1a; 分布式大数据存储——HDFS 组件分布式大数据计算——MapReduce 组件分布式资源调度——YARN 组件 可以通过它来构建集群&#xff0c;完成大数据的存储和计算 学习起来相对简单&…

怎么看电脑实时充电功率

因为我想测试不同的充电器给电脑充电的速度&#xff0c;所以就想找一款软件可以看电脑当前充电功率的软件&#xff0c;我给一个图 直接搜索就可以下载了&#xff0c;charge rate就是功率&#xff0c;这里是毫瓦&#xff0c;换算单位是 1000mw1w 所以我这里充电功率是65w&…

6.21 移动语义与智能指针

//先构造&#xff0c;再拷贝构造//利用"hello"这个字符串创建了一个临时对象//并复制给了s3//这一步实际上new了两次String s3 "hello"; 背景需求&#xff1a; 这个隐式创建的字符串出了该行就直接销毁掉&#xff0c;效率比较低 可以让_pstr指向这个空间…

squareline studio浅尝(1)在对话框添加键盘

因项目需要&#xff0c;需要修改IP地址等参数&#xff0c;需要编辑文本对话框内容&#xff0c;这时候就需要调用键盘&#xff0c;操作如下。主要为了做笔记。如有误导请及时留言。 1&#xff09;拖一个键盘到对话框页面。默认把它隐藏&#xff08;flag:hidden&#xff09; 2&…

想更好应对突发网络与业务问题?您需要一款“全流量”

全流量分析&#xff0c;能为我做什么&#xff1f; 在生活中遇到问题&#xff0c;我们的第一反应可能是拿出手机拍照记录&#xff0c;方便后续处理。这些问题是临时的、突发的。 流量分析&#xff0c;就是网络中的“手机”&#xff0c;针对突发的网络故障和安全事件&#xff0…

课程管理系统

摘 要 在大学里&#xff0c;课程管理是一件非常重要的工作&#xff0c;教学工作人员每天都要与海量的数据和信息打交道。确保数据的精确度和完整程度&#xff0c;影响着每一位同学的学习、生活和各种活动的正常展开&#xff0c;更合理的信息管理也为高校工作的正规化运行和规范…

解锁空间数据奥秘:ArcGIS Pro与Python双剑合璧,处理表格数据、矢量数据、栅格数据、点云数据、GPS数据、多维数据以及遥感云平台数据等

ArcGISPro提供了用户友好的图形界面&#xff0c;适合初学者快速上手进行数据处理和分析。它拥有丰富的工具和功能&#xff0c;支持各种数据格式的处理和分析&#xff0c;适用于各种规模的数据处理任务。ArcGISPro在地理信息系统&#xff08;GIS&#xff09;领域拥有广泛的应用&…

安全生产第一位,靠谱的漏油监测系统有哪些?

漏油监测系统&#xff0c;一般是由漏油绳、漏油控制器、监控云平台组成&#xff0c;用于实时检测油库、油罐、加油站、输油管道、油类化工厂等场所是否发生漏油事故。在这些地方一旦发生漏油&#xff0c;就极可能引发爆炸&#xff0c;损害到人员及财产安全。而一套靠谱的漏油监…

mysql 主从延迟

mysql 主从延迟 精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制&#xff08;Replication&#xff09;机制的原理和实战开发&#xff08;原理实战&#xff09; https://blog.csdn.net/l569590478/article/details/128329929 mysql主从之多线程复…

iptables(6)扩展匹配条件--tcp-flags、icmp

简介 前面我们已经介绍了不少的扩展模块,例如multiport、iprange、string、time、connlimit模块,但是在tcp扩展模块中只介绍了tcp扩展模块中的”--sport”与--dport”选项,并没有介绍”--tcp-flags”选项,那么这篇文章,我们就来认识一下tcp扩展模块中的”--tcp-flags”和i…

【MySQL进阶之路 | 高级篇】InnoDB搜索引擎行格式

1. COMPACT行格式 COMPACT行格式是MySQL5.1的默认行格式.其结构示意图如下. 大体可以分为两部分. 记录的额外信息.这里面有包括变长字段长度列表&#xff0c;NULL值列表和记录头信息.记录的真实数据. (1).变长字段长度列表 MySQL支持一些变长的数据类型.比如VARCHAR(m), VA…

基于JSP技术的个性化影片推荐系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPServlet 工具&#xff1a;MyEclipse、Tomcat、MySQL 系统展示 首页 …