三、Qt核心与Qt类库

一、Qt核心:元对象系统

1、Qt核心特点

  • Qt对标准C++进行了扩展,引入了一些新的概念和功能
  • 元对象编译器(MOC)是一个预处理器,先将Qt的特性程序转为标准C++程序,再由标准C++编译器进行编译
  • Qt为C++语言增加的特性在Qt Core模块中实现,由Qt的元对象系统实现。包括信号与槽机制、实行系统、动态类型转换等。使用信号与槽机制,只有添加Q_OBJECT宏,moc才能对类中的信号与槽进行预处理。

2、元对象系统

  • QObject类是所有使用元对象的类的基类
  • 在一个类的private部分声明private Q_OBJECT宏
  • MOC(元对象编译器)为每个QObject的子类提供必要代码。

二、Qt核心:属性系统、信号与槽

1、属性系统

Q_PROPERTY宏定义一个返回类型为type,名称为name的属性.
Q_PROPERTY(type nameREAD getFunction[WRITE setFunction][RESET resetFunction][NOTIFY notifySignal][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][CONSTANT][FINAL])

(1)创建属性

class QMyWidGet : public QWidget
{Q_OBJECTQ_PROPERTY(bool focus READ hasFocus)Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)Q_PROPERTY(QCursor cursor READ cursor WRITE SetCursor RESET unsetCursor)
public:explicit QMyWidget(QWidget *parent = nullptr);
};

(1)使用属性

setProperty可以在运行时为类定义一个新的属性,称之为动态属性。
QPushButton *button = new QPushButton;
QObject *object = button;
object->setProperty("flat", true);
bool isFalt = object->property("flat");

2、类的附加信息

Q_OBJECT
Q_CLASSINFO("author", "ZhangSan")
Q_CLASSINFO("compay", "XXX")
Q_CLASSINFO("version"' "1.1.1")QMyWidget *myWidget = new QMyWidget;
QDebug()<<myWidget->metaObject()->classInfo(0).name();
QDebug()<<myWidget->metaObject()->classInfo(0).value();
QDebug()<<myWidget->metaObject()->classInfo(1).name();
QDebug()<<myWidget->metaObject()->classInfo(1).value();

在这里插入图片描述

3、信号与槽

(1)原型

    static QMetaObject::Connection connect(const QObject *sender, const char *signal,const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,const QObject *receiver, const QMetaMethod &method,Qt::ConnectionType type = Qt::AutoConnection);inline QMetaObject::Connection connect(const QObject *sender, const char *signal,const char *member, Qt::ConnectionType type = Qt::AutoConnection) const;
最后一个参数Qt::ConnectionType表示信号与槽之间的关联方式
  • Qt::AutoConnection(默认值):自动确定关联方式
  • Qt::DirectConnection:信号被发射时,槽立即执行,槽函数与信号在同一个线程
  • Qt::QueuedConnection:事件循环回到接受者线程后执行槽,槽与信号在不同线程
  • Qt::BlockingQueuedConnection:信号线程会被阻塞直到槽函数执行完毕,当槽函数与信号在同一个线程,会导致死锁。

(2)使用

// 如果信和槽函数都带有参数,需要注明参数类型
connect(spinFontSize, SIGNAL(valueChanged(int)), this,SLOT(on_spinBoxFontSize_valueChanged(int)));
// 当信号名称(包括参数)唯一时,可以使用以下绑定
connect(spinFontSize, &QSpinBox::valueChanged, this,MainWindow::on_spinBoxFontSize_valueChanged);

(3)自定义信号

在槽函数里,使用QObject::sender()可以回去信号发射者的指针
QSpinBox *spinbox = qobject_cast<QSpinBos*>(sender());
class QPersen : public QObject
{Q_OBJECT
private:int m_age = 10;
public:voud incAge();
signals:void ageChanged(int value);	// 信号函数
};
void QPerson::incAge()
{m_age++;emit ageChanged(m_age);	//发射信号
}
信号函数必须无返回值,但可以由输入参数,信号函数无需实现,只需要在某些条件下发射信号。

三、元对象系统特性测试

在这里插入图片描述

1、创建项目(基于QWidget)

2、添加UI

在这里插入图片描述

3、添加QPerson类,基于QObject

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#ifndef QPERSON_H
#define QPERSON_H#include <QObject>class QPerson : public QObject
{Q_OBJECTQ_CLASSINFO("author", "liutt")Q_CLASSINFO("compay", "XXX")Q_CLASSINFO("version", "1.1.1")// 添加属性Q_PROPERTY(unsigned age READ age WRITE setAge NOTIFY ageChanged)Q_PROPERTY(QString name MEMBER m_strName)   //MEMBER 绑定变量Q_PROPERTY(int score MEMBER m_nScore)private:unsigned int m_nAge = 10;QString m_strName;int m_nScore = 79;public:explicit QPerson(QString strName, QObject *parent = nullptr);unsigned int age();void setAge(unsigned int value);void incAge();signals:void ageChanged(unsigned int value);public slots:
};#endif // QPERSON_H
#include "qperson.h"QPerson::QPerson(QString strName, QObject *parent) : QObject(parent)
{m_strName = strName;
}unsigned int QPerson::age()
{return m_nAge;
}void QPerson::setAge(unsigned int value)
{m_nAge = value;emit(ageChanged(m_nAge));
}void QPerson::incAge()
{m_nAge++;emit(ageChanged(m_nAge));
}

4、添加信号与槽功能

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "qperson.h"namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();private:void on_ageChanged(unsigned int value);private slots:void on_btnBoyInc_clicked();void on_btnGirlInc_clicked();void on_btnClassInfo_clicked();void on_spin_valueChanged(int value);private:Ui::Widget *ui;QPerson *boy;QPerson *girl;};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"#include <QMetaClassInfo>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ui->spinBoxBoy->setProperty("isBoy", true);ui->spinBoxGirl->setProperty("isBoy", false);boy = new QPerson("小乐");boy->setProperty("score", 60);boy->setProperty("age", 12);boy->setProperty("sex", "boy");connect(boy, &QPerson::ageChanged, this, &Widget::on_ageChanged);girl = new QPerson("小美");girl->setProperty("score", 70);girl->setProperty("age", 11);girl->setProperty("sex", "girl");connect(girl, &QPerson::ageChanged, this, &Widget::on_ageChanged);ui->spinBoxBoy->setValue(12);ui->spinBoxGirl->setValue(11);connect(ui->spinBoxBoy, SIGNAL(valueChanged(int)), this, SLOT(on_spin_valueChanged(int)));connect(ui->spinBoxGirl, SIGNAL(valueChanged(int)), this, SLOT(on_spin_valueChanged(int)));
}Widget::~Widget()
{delete ui;
}void Widget::on_spin_valueChanged(int value)
{Q_UNUSED(value)QSpinBox *spinBox = qobject_cast<QSpinBox*>(sender());if(spinBox->property("isBoy").toBool()) {boy->setAge(spinBox->value());}else {girl->setAge(spinBox->value());}
}void Widget::on_ageChanged(unsigned int value)
{Q_UNUSED(value)QPerson *pPerson = qobject_cast<QPerson*>(sender());QString strName = pPerson->property("name").toString();QString strSex = pPerson->property("sex").toString();unsigned int nAge = pPerson->age();ui->plainTextEdit->appendPlainText(strName+","+strSex+QString::asprintf(",年龄=%d", nAge));
}void Widget::on_btnBoyInc_clicked()
{boy->incAge();
}void Widget::on_btnGirlInc_clicked()
{girl->incAge();
}void Widget::on_btnClassInfo_clicked()
{const QMetaObject* meta = boy->metaObject();ui->plainTextEdit->clear();ui->plainTextEdit->appendPlainText("类元对象信息");ui->plainTextEdit->appendPlainText(QString("类名称:%1").arg(meta->className()));ui->plainTextEdit->appendPlainText("property: ");for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) {QMetaProperty prop = meta->property(i);const char *propName = prop.name();QString strPropValue = boy->property(propName).toString();ui->plainTextEdit->appendPlainText(QString("属性名称:%1,属性值:%2").arg(propName, strPropValue));}ui->plainTextEdit->appendPlainText("classInfo: ");for (int i = meta->classInfoOffset(); i < meta->classInfoCount(); ++i) {QMetaClassInfo classInfo = meta->classInfo(i);ui->plainTextEdit->appendPlainText(QString("类信息名称:%1,类信息值:%2").arg(classInfo.name(), classInfo.value()));}
}

四、Qt全局定义

1、Qt全局定义

<QtGlobal>头文件包含了Qt类库的一些全局定义:
  • 基本函数类型
  • 函数

(1)Qt数据类型

typedef signed char qint8;         /* 8 bit signed */
typedef unsigned char quint8;      /* 8 bit unsigned */
typedef short qint16;              /* 16 bit signed */
typedef unsigned short quint16;    /* 16 bit unsigned */
typedef int qint32;                /* 32 bit signed */
typedef unsigned int quint32;      /* 32 bit unsigned */
typedef long long qint64;           /* 64 bit signed */
typedef unsigned long long quint64; /* 64 bit unsigned */

(2)宏定义

QT_VERSION	数值版本
QT_VERSION_CHECK()	// QT_VERSION_CHECK(5,0,0)
Q_BYTE_ORDER		// 系统内存字节序
Q_BIG_ENDIAN		// 大端字节序
Q_LITTLE_ENDIAN		// 小端字节序
Q_DECL_IMPORT		// 共享库导入
Q_DECL_EXPORT		// 共享库导出
Q_DECL_OVERRIDE		// 用于重载虚函数,没有被重载则报错
Q_DECL_FINAL		//	虚函数定义为最终级别,不能被重载
Q_UNUSED(name)		// 在函数中定义不在函数中使用的参数
foreach(variable, container)	// 用于容器遍历
forever 			//构造一个无线循环
qDebug(const char* message, ...)	// 输出日志,格式化

五、容器类

1、Qt容器

Qt的容器类比STL中的容器类更轻巧,安全和易用

顺序容器:QList(下标索引),QLinkKedList(不支持下标索引),QVector,QStack,QQueue
关联容器:QMap,QMultiMqp,QHash,QMultiHash,QSet

2、STL类型迭代器

容器类只读迭代器迭代器
QList,QQueueQList::const_iteratorQList::iterator
QLinkedListQLinkedList::const_iteratorQLinkedList::iterator
QVector,QStackQVector::const_iteratorQVector::iterator
QSetQSet::const_iteratorQSet::iterator
QMap<Key,Value>,QMultiMap<Key,Value>QMap<Key,Value>::const_iteratorQMap<Key,Value>::iterator

五、Qt类库的模块

Qt类的模块可以分为几大类:
  • Qt基本模块(Qt Essentials):提供了Qt的所有平台的基本功能
  • Qt附加模块(Qt Add-Ons):实现一些特定功能的提供附加价值的模块
  • 增值模块(Value-AddModules):单独发布的提供额外价值的模块或工具
  • 技术预览模块(Technology Preview Modules):一些处于开发阶段,但是可以最为技术预览使用的模块
  • Qt工具(Qt Tools):帮助应用程序开发的一些工具

1、Qt基本模块

Qt Core					其他模块都用的核心非图形类
Qt GUI					设计GUI界面的基础类,包括OpenGL
Qt Multimedia			音频、视频、摄像头和广播功能的类
Qt Multiply Widgets		实现多媒体的界面租界类
Qt Network				实现网络编程更简单和轻便的类
Qt QML					用于QML和JavaScript语言的类
Qt Quick				英语构建具有定制用户界面的动态应用的声明框架
Qt Quick Controls		创建桌面样式用户界面,基于Qt Quick的用户界面控件
Qt Quick Dialogs		用于Qt Quick的系统对话框类型
Qt Quick Layouts		用于Qt Quick2界面元素的布局项
Qt SQL					使用SQL数据库操作
Qt Test					用于应用程序的库进行单元测试的类
Qt Widgets				用于构建GUI界面的C++图形组件类
qmake构建时,Qt GUI模块时自动被加入项目的,如果项目不适用GUI功能,使用以下指令取消
QT-=gui
其他模块一般不会被自动加入,在项目使用到某个模块,可以在项目配置中添加:
QT+=sql
QT+=multimedia multimediawidgets

2、Qt工具

Qt Designer		用于扩展Qt Designer的类
Qt Help			在应用程序中继承在线文档
QtUI Tools		操作Qt Designer生成的窗体的类

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

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

相关文章

AI爆文变现:怼量也有技巧!如何提升你的创作收益

做AI爆文项目&#xff0c;赚小钱是没有问题的。 想要赚大钱&#xff0c;就是要做矩阵&#xff0c;怼量。 之前参加训练营的时候&#xff0c;也是要求怼量。 怼量&#xff0c;加高质量文章&#xff0c;让你的收益更高。 如何提升文章质量&#xff0c;减少AI味&#xff0c;AI…

[AutoSar]基础部分 RTE 06 对runnable的触发和SWC的影响

目录 关键词平台说明一、runnable二、RTE的event2.1Mode类型event2.2周期触发类型2.3 数据交互触发 三、internal runnable value四、专属运行区指定五、per_instance memory 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商T…

数据结构实验1:栈和队列的应用

目录 一、实验目的 二、实验原理 1.1栈的基本操作 1.1.1 栈的定义 1.1.2 初始化栈 1.1.3 压栈&#xff08;Push&#xff09; 1.1.4 出栈&#xff08;Pop&#xff09; 1.1.5 判空&#xff08;isEmpty&#xff09; 1.1.6 查看栈顶元素&#xff08;Top&#xff09; 1.1…

光速爱购--靠谱的SpringBoot项目

简介 这是一个靠谱的SpringBoot项目实战&#xff0c;名字叫光速爱购。从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目。 教程路线是&#xff1a;搭建环境> 安装软件> 创建项目> 添加依赖和配置> 通过表生成代码> 编写Java代码&g…

安科瑞电力物联网系统在电力设备在线监测中的应用——安科瑞 顾烊宇

摘要&#xff1a;近年来&#xff0c;社会经济发展速度不断提升&#xff0c;对电力能源的需求大幅增加&#xff0c;为保障变电站等电力设备合理发挥功能&#xff0c;保障供电安全性和稳定性&#xff0c;应当加强对电力设备的监测和管理。而电力物联网技术是现代一种安全工器具的…

基于JavaCV对RTSP、RTMP视频流检测

1. Maven依赖 1.1 懒人版 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.5</version> </dependency> 1.2 精确版 由于整个依赖较大&#xff08;约900M&#xff09;&…

x-cmd pkg | trdsql - 能对 CSV、LTSV、JSON 和 TBLN 执行 SQL 查询的工具

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 trdsql 是一个使用 sql 作为 DSL 的强大工具: 采用 SQL 对 CSV、LTSV、JSON 和 TBLN 文件执行查询与 MySQL&#xff0c;Postgresql&#xff0c;Sqlite 的 Driver 协同&#xff0c;可以实现对应数据库的表与文件的 JO…

【JaveWeb教程】(8)Web前端基础:Vue组件库Element之Table表格组件和Pagination分页组件 详细示例介绍

目录 1 Table表格组件1.1 组件演示1.2 组件属性详解 2 Pagination分页2.1 组件演示2.2 组件属性详解2.3 组件事件详解 接下来我们来学习一下ElementUI的常用组件&#xff0c;对于组件的学习比较简单&#xff0c;我们只需要参考官方提供的代码&#xff0c;然后复制粘贴即可。本节…

塑料制品行业生产管理MES系统解决方案

塑料制品产业虽然有一定的规模和基础&#xff0c;但存在自主创新能力低、“散小乱”、品牌效应不明显、行业创新能力与庞大的产业不匹配或支撑不足等问题&#xff0c;塑料加工行业还处在质量型产业的初期&#xff0c;抗风险能力低。 注塑行业6大痛点&#xff1a; 1.生产效率低…

odoo17 | 模型视图继承

前言 Odoo的强大之处在于它的模块化。模块专门用于满足业务需求&#xff0c;但模块也可以彼此交互。这对于扩展现有模块的功能非常有用。例如&#xff0c;在我们的房地产场景中&#xff0c;我们希望在常规用户视图中直接显示销售人员的属性列表。 但是在讨论特定的Odoo模块继…

Verilog 入门简明教程

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《Verilog语言入门教程》 <<<< 返回总目录 <<<< 全文 6000字 1. 基本语法 换行&#xff1a; 格式自由&#xff0c;可以在一行内编写&#xff0c;也可跨多行编写&#xff0c; 建议…

霍兰德职业兴趣测试 60题(免费版)

霍兰德职业兴趣理论从兴趣的角度出发探索职业指导的问题&#xff0c;明确了职业兴趣的人格观念&#xff0c;使得人们对于职业兴趣的认识有了质的变化。在霍兰德职业兴趣理论提出来之前&#xff0c;职业兴趣和职业环境二者分别独立存在&#xff0c;正是霍兰德的总结&#xff0c;…