当前位置: 首页 > ai >正文

QT(概述、基础函数、界面类、信号和槽)

一、概述 

1、QT

QT是一个c++的第三方库,是专门用来进行界面编程的一个库

  1. QT本身实现了多种软件:
  2. ubuntu系统中所有界面都是QT做的
  3. 最新版本的QQ也是QT做的
  4. 嵌入式编程中,几乎所有的上位机,都可以使用QT来做

QT本身除了实现了ui界面编程之外,还实现了很多非ui界面编程的功能

        网络通信、蓝牙通信、串口通信、web浏览器显示等等等等

基本上来说,现实生活当中可能需要用到的功能,都能用QT来实现

1)QT的手册怎么查询

在左侧功能栏,点到帮助,将目录改成索引,可以通过搜索栏查找要查找的类

最上面一栏是内容栏,列出了这个类中所包含哪些东西(单击绿色的文字可以跳转到目标)

第二个是类的属性栏,列出了类的基类,头文件等等

2、关于QT的头文件

QT的所有头文件,都会以 Q 开头,后面的所有单体,以驼峰命名法,命名

#include <QDebug>
#include <QApplication>
#include <QLabel>
#include <QWidget>
#include <QLineEdit>
#include <QTextEdit>
#include <QPalette>
#include <QPushButton>

3、关于编译执行后的输出方式

        在编辑这一栏,中可以看见项目工程文件,工程文件中有一个和工程文件同名的.pro文件,该文件中的是工程文件的编译和查找方式(就像Makefile)。

在屏幕下方的提示栏输出:

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \main.cpp \HEADERS += \FORMS += \qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

重新弹出终端文本框输出(自带的):

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qtSOURCES += main.cpp

二、QT的一些基础的函数

1、qDebug(用来debug)

格式:#include <QDebug>qDebug() << 要输出的目标;
功能:该函数返回一个QT的标准输出流对象
解析:QDebug类型对象,直接将该类型对象理解成 cout 就行了

三、QT界面类

1、QWidget(窗口类)

#include <QWidget>
构造函数:QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
QWidget是一个窗口类
注意:QWidget创建的对象只有一个窗口,不能输入,不能显示文字,一般用于辅助布局QWidget这个窗口类的作用就是用来实现大界面的框架,底盘,用来承载其他各种各样的子界面

2、QLabel(文本框)

#include <QLabel>
构造函数:QLabel(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())QLabel(const QString &text, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
功能:这是一个文本框,只能显示编译的文本,不能通过文本框输入文本
成员方法:1.setText(设置文本内容)2.clear(清空文字)······

3、QLineEdit(行编辑文本框)

#include <QLineEdit>
构造函数:QLineEdit(QWidget *parent = Q_NULLPTR)QLineEdit(const QString &contents, QWidget *parent = Q_NULLPTR)
功能:这是一个行编辑器,可以进行一行的文本编辑
成员方法:1.setText(设置文本内容)2.setPlaceholderText(设置提示文字)3.setEchoMode(设置显示方式)4.setPalette(QPalette pe);(设置成调色板配置的颜色)······

4、QTextEdit(文本编辑文本框)

#include <QTextEdit>
构造函数:QTextEdit(QWidget *parent = Q_NULLPTR)QTextEdit(const QString &text, QWidget *parent = Q_NULLPTR)
成员方法:1.setText(设置文本内容)2.append(换行并追加文字)3.setPlaceholderText(设置提示文字)4.setEchoMode(设置显示方式)5.setPalette(QPalette pe);(设置成调色板配置的颜色)······

5、QPalette(调色板)

#include <QPalette>
构造函数:(还有的其他的构造函数可以自己查找)QPalette()QPalette(const QColor &button)
成员方法:1.setColor(设置调色板的颜色)······

6、对象树

对象树是QT的核心机制之一

QT中绝大多数的类都继承自一个基类QObject,继承自同一个基类的好处是方便多态

QObject有一个重要的分支派生类:QWidget,结构图如下

7、父子对象,父子组件

1)父子组件的关系

在对象树中,在此继承关系下,所有的刺激组件都可以将他的上一级或同级的对象,设为父组件

多个子窗口设置同一个窗口为父组件,组成父子组件后,有以下优点:

  1. 父子组件是一个整体,子组件是父组件的一部分,父组件的显示、关闭、移动操作,子组件也会同步执行。
  2. 由于子组件是父组件的一部分,所以子组件的生命周期由父组件自动管理,当父组件析构时,父组件也会自动调用子组件的析构函数。

2)如何设置父子组件

Qobject的所有派生类中都有一个默认参叫做parent,就比如下图的这些构造函数,在构造对象时传入具体的窗口对象,就可以将其设置为自己的父组件。

如下图,就可以将qw设置为ql的父组件。

8、QBoxLayout(布局类)

布局类有两个派生类:

分别是:QHBoxLayout(水平派生类)和 QVBoxLayout(垂直派生类)

1)QHBoxLayout(水平派生类)

#include <QHBoxLayout>
构造函数:QHBoxLayout(QWidget *parent)
成员函数:addWidget(添加组件到布局中)

2)QVBoxLayout(垂直派生类)

#include <QVBoxLayout>
构造函数:QVBoxLayout(QWidget *parent)
成员函数:addWidget(添加组件到布局中)

3)setLayout(设置窗口的布局)

#include <QWidget>
void QWidget::setLayout(QLayout *layout)

练习:发送消息界面

四、信号和槽

1、信号

当一个组件发生人为操作 、状态发生改变的时候,就会发出一个对应的信号,用来通知外部,当前组件发生了什么

为什么要通知外部当前组件发生了什么:被通知的外部,一旦捕获到信号,就可以做出对应的处理

例如:

点击按钮 >> 按钮发出clicked信号 >> 外部捕获clicked信号 >> 做出对应操作(如发送消息,关闭窗口等操作)

QT中的信号可以携带参数:

目的在于:通知外部当前组件发生了什么操作的时候,还可以通过参数的形式,将一些必要的数据发送给外部

2、槽

用来处理信号的一个函数

当外部 或者 特定组件,捕获到信号之后,就会调用对应的槽函数,来处理该信号

点击按钮 >> 按钮发出clicked信号 >> 外部捕获clicked信号 >> 做出对应操作,这里对应的操作,其实就是槽函本身

由槽函数来实现对应的操作

QT中的槽函数由2个特点:

  1. 槽函数允许用户直接手动调用,这个时候,槽函数的参数,直接由用户手动传入即可
  2. 槽函数同时允许通过信号函数触发,这个时候,槽函数的参数来自于信号的参数,即信号发出的同时,通过参数发出了一组数据,该数据由对应的槽函数的参数接受

3、connect(关联信号和槽)

QObject::connect(发出信号的组件的地址,信号函数指针,接受信号的组件地址,槽函数指针)
功能:将指定的信号和指定的槽关联,当发出信号后,就执行槽函数
参数:发出信号的组件的地址:组件地址信号函数指针:&信号所属的类名::信号函数名接受信号的组件地址槽函数指针: &槽函数所属的类名::槽函数名

4、信号和槽的可关联性

就是信号和槽之间的关联需要满足一个的条件:

如果槽函数有一个形参,那么与之关联的信号就必须在相同位置传递一个实参;
如果信号有一个实参要传递,但是槽函数没有形参接收则没关系。

5、自定义信号和槽

1)自定义槽函数

我们可以给自定义的窗口写自定义槽函数

自定义槽函数可以写在 public 中,也可以写在 public slots 中,写在 public slots 中更规范

2)自定义信号

必须写在访问限制符 signals 下

自定义信号只需要声明不需要定义

3)如何触发自定义信号

调用信号函数:emit 信号函数名();
注意,如果使用了自定义信号,需要满足以下3个要求1.使用自定义信号的类,必须直接或者间接的继承自 QObject,也就是这个类必须是对象树中的成员之一2.必须在使用了自定义信号的类的一开头,写上一个关键    Q_OBJECT3.使用自定义信号的类,必须分文件写法,不能和 main 在同一个文件中

6、connect的多种使用方式

1)关联某个对象的信号和槽

QObject::connect(btn,&QPushButton::clicked,this,&Widget::myslot);

2)将某个对象的信号与lambda

QObject::connect(ui->pushButton,&QPushButton::clicked,[=](){QString str = ui->lineEdit->text();ui->textEdit->append(str);ui->lineEdit->clear();
});一般说,这是我们最经常使用的方法
因为 lambda表达式能够捕获父作用域中所有内容:包括ui以及其他的私有成员
非常好用

3)将某个对象的信号与关联函数关联

void func(){qDebug() << "hello world";
}QObject::connect(ui->pushButton,&QPushButton::clicked,func);
一般来说,我们很少让一个信号关联到全局函数
因为全局函数无法访问ui

4)将对象的信号关联到另一个信号

QObject::connect(ui->pushButton_2,&QPushButton::clicked,ui->pushButton,&QPushButton::clicked);
由一个信号触发另一个信号
这个也很好用,但是目前来说用不上

7、转到槽功能

转到槽功能,会自动生产一个与目标组件,所选择的信号关联好的槽函数

转到槽有局限性:只有ui界面里面的组件能够使用转到槽,ui界面中不能显示的窗口无法使用转到槽

1. 双击 .ui 文件

2. 绘制界面

3. 转到槽(在Widget文件中添加槽函数)

4. 添加的槽函数

练习:发送消息

基于发送消息界面的练习,制作发送消息的显示,点击 "发送" 按钮之后,将le中的文字,同步到te上去,
并且删除le中的文字点击 "发送" 按钮后,触发按钮的 clicked 信号
1:获取并记录lineEdit的文字
2:将记录的文字设置到textEdit上面去
3:清空lineEdit上的文字

1)Widget类文件

2)main函数文件

http://www.xdnf.cn/news/17636.html

相关文章:

  • 【SpringBoot】08 容器功能 - SpringBoot底层注解汇总大全
  • 《汇编语言:基于X86处理器》第13章 高级语言接口(2)
  • __base__属性
  • [ Mybatis ] 框架搭建与数据访问
  • 【Android】【bug】Json解析错误Expected BEGIN_OBJECT but was STRING...
  • Qt——信号和槽
  • 移动端网页调试实战,键盘弹出与视口错位问题的定位与优化
  • iOS 签名证书实践日记,我的一次从申请到上架的亲历
  • vue项目封装axios请求,支持判断当前环境及判断token是否过期等等(详细教程,可复制粘贴代码)
  • UE官方文档学习 C++ TAarry 查询(三)Contain,Find函数的使用
  • Java面试题储备11: mysql优化全面讲一下,及你遇到的对应业务场景
  • 第六十三章:AI模型的“跨界之旅”:不同硬件架构下的兼容性方案
  • RK3568 Linux驱动学习——Linux LED驱动开发
  • 数据分析与可视化
  • Java的异常机制
  • Supabase快速入门与实战指南
  • Effective C++ 条款37:绝不重新定义继承而来的缺省参数值
  • 存储过程作为系统逻辑核心的架构思考 —— 以 SaaS 系统为例
  • 计算机视觉(8)-纯视觉方案实现端到端轨迹规划(模型训练+代码)
  • 数据库规范化:消除冗余与异常的核心法则
  • 经济基础知识第一节:物质资料生产和基本经济规律(一)
  • SQL 与 NoSQL 的核心区别
  • 为什么灰度图用G(绿色)通道?
  • Docker 101:面向初学者的综合教程
  • 【报错处理】mount: /boot/efi: unknown filesystem type ‘LVM2_member‘.
  • 记录一次react渲染优化
  • 实现文字在块元素中水平/垂直居中详解
  • 教程 | 用Parasoft SOAtest实现高效CI回归测试
  • AWS EKS 常用命令大全:从基础管理到高级运维
  • [激光原理与应用-257]:理论 - 几何光学 - 光束整形