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

news2024/11/24 4:34:18

一、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.coloradmin.cn/o/1847331.html

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

相关文章

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

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

原来这个东西叫 Docker

大家好&#xff0c;我是徒手敲代码。 今天来聊聊 Docker 三个时代的演变 首先要先了解 Docker 出现的背景。在计算机技术的发展历程中&#xff0c;我们经历了从物理机时代到虚拟机时代&#xff0c;再到容器化时代的演变。 在物理机时代&#xff0c;应用程序直接运行在物理服务…

精准测试与传统的手工测试

大部分测试从业人员都经历了手工测试到自动化测试递进&#xff0c;测试技术及思路都发生了日新月异的变化&#xff0c;有些中厂及大厂都有一套强大且复杂的自动化测试用例时刻保障产品的稳定性及正确性。 所谓精准测试&#xff0c;就是借助一定的技术手段、通过算法的辅助对传…

游戏遇到攻击有什么办法能解决?

随着网络技术的飞速发展&#xff0c;游戏行业在迎来繁荣的同时&#xff0c;也面临着日益严峻的网络威胁。黑客攻击、数据泄露、DDoS攻击等安全事件频发&#xff0c;给游戏服务器带来了极大的挑战。面对愈演愈烈的网络威胁&#xff0c;寻找一个能解决游戏行业攻击问题的安全解决…

【Matlab】CNN-LSTM分类 卷积神经网络-长短期记忆神经网络组合模型(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/89466499 分类算法资源合集&#xff1a;https://download.csdn.net/download/vvoennvv/89466519 目录 Matlab SVM支持向量机分类算法 Matlab RF随机森林分类算法 Matlab RBF径向基神经网络分类算法 Ma…

容器之事件盒

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>static void label_const(GtkWidget *eventbox) {static int i 0;static char citem[100];sprintf(citem, &quo…

OrangePi连接Wi-Fi步骤

下面介绍的是用终端命令行的方式配置WIFI&#xff1a; 首先输入以下命令用于扫描并查看周围的WiFi热点。也可以直接连接。 nmcli dev wifi之后会在终端打出周围所有可以连接的WiFi&#xff0c;按方向键上下可以查看显示更多&#xff0c;按q键退出。 然后同样使用nmcli命令连接…

Java中setLineWrap(true)和setWrapStyleWord(true)优化TextArea

在 Java Swing 开发中&#xff0c;JTextArea 是一个多行的文本区域组件&#xff0c;常用于显示和编辑大量文本。当处理长文本时&#xff0c;默认行为是不换行并且出现水平滚动条&#xff0c;这通常会降低用户体验。幸运的是&#xff0c;JTextArea 提供了两个非常有用的方法&…

解决Few-shot问题的两大方法:元学习与微调

基于元学习&#xff08;Meta-Learning&#xff09;的方法&#xff1a; Few-shot问题或称为Few-shot学习是希望能通过少量的标注数据实现对图像的分类&#xff0c;是元学习(Meta-Learning)的一种。 Few-shot学习&#xff0c;不是为了学习、识别训练集上的数据&#xff0c;泛化…

【面试题分享】重现 string.h 库常用的函数

文章目录 【面试题分享】重现 string.h 库常用的函数一、字符串复制1. strcpy&#xff08;复制字符串直到遇到 null 终止符&#xff09;2. strncpy&#xff08;复制固定长度的字符串&#xff09; 二、字符串连接1. strcat&#xff08;将一个字符串连接到另一个字符串的末尾&…

小程序 获取插件用户openpid?

接口英文名 getPluginOpenPId 功能描述 通过 wx.pluginLogin 接口获得插件用户标志凭证 code 后传到开发者服务器&#xff0c;开发者服务器调用此接口换取插件用户的唯一标识 openpid。 调用方式 HTTPS 调用 第三方调用 调用方式以及出入参和HTTPS相同&#xff0c;仅是调…

慢阻肺患者为何容易营养不良?朗格力教你轻松改善

#肺科营养#朗格力#班古营养#复合营养素#肺部营养#肺部健康# 慢阻肺是我国常见的、高患病率的慢性呼吸系统疾病,会对肺结构和功能产生影响,从而引起各种不良反应,其中营养不良是常见并发症之一。慢阻肺为什么会发生营养不良?营养不良又是怎么伤害慢阻肺的呢?为什么像班古精准…

深度学习之绘图基础

文章目录 1.实验目的2. 需求3.代码结果图片 1.实验目的 熟练绘制各种图像&#xff0c;为深度学习打基础 2. 需求 给定一个函数&#xff0c;需要你画出原图像以及这个函数在某点切线图像 3.代码 # File: python绘制函数图像以及倒数图像.py # Author: chen_song # Time: 20…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的测试用例执行计划(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…

【尚庭公寓SpringBoot + Vue 项目实战】移动端浏览历史(二十二)

【尚庭公寓SpringBoot Vue 项目实战】移动端浏览历史&#xff08;二十二&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】移动端浏览历史&#xff08;二十二&#xff09;1、业务介绍2.接口开发2.1.分页查询浏览历史列表2.2.保存浏览历史 1、业务介绍 浏览历史指的…

暴雨讲堂|通往AGI的必由之路—AI agent是什么?

在三月份英伟达的新品发布会上&#xff0c;黄仁勋反复提及一个词汇— Generalist Embodied Agent&#xff0c;意为“通用具身智能体”&#xff0c;给观众留下了深刻的印象。其实具身智能指的是不同形态的拥有主动感知交互能力的机器人。其实&#xff0c;业界对它还有一个更为熟…

【读论文】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…

python中进程的几种创建方式

在新创建的子进程中&#xff0c;会把父进程的所有信息复制一份&#xff0c;它们之间的数据互不影响。 1.使用os.fork()创建 该方式只能用于Unix/Linux操作系统中&#xff0c;在windows不能用。 import os# 注意&#xff0c;fork函数&#xff0c;只在Unix/Linux/Mac上运行&am…

Webpack4从入门到精通以及和webpack5对比_webpack现在用的是哪个版本

3.1 打包样式资源css-loader、style-loader… {// 匹配哪些文件test: /\.less$/,// 使用哪些loader进行处理use: [// use数组中loader执行顺序&#xff1a;从右到左&#xff0c;从下到上&#xff0c;依次执行(先执行css-loader)// style-loader&#xff1a;创建style标签&#…

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

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