三、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.rhkb.cn/news/233032.html

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

相关文章

LeetCode第32题 : 最长有效括号

题目介绍 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()" 示例 2&#xf…

【Python机器学习】线性模型——用于多分类的线性模型

很多线性分类模型只使用与二分类问题&#xff0c;将二分类算法推广到多分类算法的一种常见方法是“一对其余”方法。在“一对其余”方法中&#xff0c;对每个类别都学习一个二分类模型&#xff0c;将这个类别和其他类别尽量区分&#xff0c;这样就生成了与类别数相同的二分类模…

设计模式——最全梳理,最好理解

新年献礼&#xff01; 设计模式呕心梳理 创建型模式 单例模式&#xff08;Singleton Pattern&#xff09;https://blog.csdn.net/qq_34869143/article/details/134874044 整理中... 结构型模式 代理模式&#xff08;Proxy Pattern&#xff09;https://blog.csdn.net/qq_34…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

css3 transform:scale

transform:scale 语法&#xff1a;transform:scale(x,y); <html> <head><style>.box1 {display: inline-block;width: 200px;height: 200px;background-color: pink;}.box2 {display: inline-block;width: 200px;height: 200px;background-color: red;tran…

电脑丢失dll文件怎么办,dll修复工具可一键修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法找到某某.dll文件”。这种情况通常是由于dll文件丢失或损坏导致的。那么&#xff0c;究竟是什么原因导致了dll文件的丢失呢&#xff1f;又该如何预防dll文件…

Linux vi/vim 教程

文章目录 【 1. vi/vim 的三种模式 】1.1 命令模式1.2 输入模式1.3 底线命令模式 【 2. 实例 】【 3. vim 的其他命令 】 所有的 Unix Like 系统都会内建 vi 文本编辑器&#xff0c;其他的文本编辑器则不一定会存在。目前我们使用比较多的是 vim 编辑器。vim 从 vi 发展出来&am…

transforms的操作

一、transforms的操作 1、transforms.RandomChoice transforms.RandomChoice 是一个数据转换操作&#xff0c;用于从一系列的转换方法中随机选择一个进行数据增强。 参数&#xff1a; transforms&#xff1a;一个包含多个转换方法的列表或元组。 示例&#xff1a; import …

[Javaweb/LayUI/上机考试作业/开源]学生/图书/课程/仓库等管理系统六合一基础功能通用模板

展示 考试要求 给定用户表和六张图书/教师/顾客/仓库....的表&#xff08;随机给每人抽选&#xff09;&#xff0c;要求实现用户登录注册&#xff0c;异步更新&#xff0c;对物品增删改查&#xff0c;精确/模糊查询等。 环境 tomcat 9 mysql 8 java 17 项目结构 项目类图 写前…

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

JDK 11:崭新特性解析

JDK 11&#xff1a;崭新特性解析 JDK 11&#xff1a;崭新特性解析1. HTTP Client&#xff08;标准化&#xff09;示例代码 2. 局部变量类型推断的扩展示例代码 3. 新的字符串方法示例代码 4. 动态类文件常量示例代码 5. Epsilon 垃圾收集器使用方式 结语 JDK 11&#xff1a;崭新…

Redis(一)

1、redis Redis是一个完全开源免费的高性能&#xff08;NOSQL&#xff09;的key-value数据库。它遵守BSD协议&#xff0c;使用ANSI C语言编写&#xff0c;并支持网络和持久化。Redis拥有极高的性能&#xff0c;每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数…

el-select下拉框 change事件返回该项所有数据

主要代码 value-key <template><div><el-selectv-model"value"value-key"label"placeholder"请选择"change"selectChange"><el-optionv-for"item in options":key"item.label":label"…

分布式锁3: zk实现分布式锁2 使用临时节点(需要自旋)

一 使用临时节点实现分布式锁 1.1 代码截图 1.2 代码如下 由于zookeeper获取链接是一个耗时过程&#xff0c;这里可以在项目启动时&#xff0c;初始化链接&#xff0c;并且只初始化一次。借助于spring特性&#xff0c;代码实现如下&#xff1a; package com.atguigu.distri…

labelme的json转mask,实测有效

1、创建一个conda的虚拟环境 conda creat -n labelme python3.82、转到你的标注文件夹&#xff08;包括json和图片&#xff09; cd C:/Users/Administrator/Desktop/json3、你需要在标注文件夹下用txt写下以下代码&#xff0c;并保存bat文件。 放在最后一个就可以了 echo of…

Fiber Golang 中的路由和中间件

掌握 GoLang Fiber 中的路由和中间件艺术&#xff0c;以进行高效的 Web 开发 在网络开发领域中&#xff0c;创建一个有效地路由和管理各种任务的 Web 应用程序至关重要。路由决定了如何处理传入的请求&#xff0c;而中间件在执行任务&#xff0c;如身份验证、日志记录和请求解…

PyTorch|构建自己的卷积神经网络——卷积层

在构建我们的网络时&#xff0c;我们需要用到卷积层提取特征&#xff0c;来看到一些特别的东西&#xff0c;当图片经过卷积层&#xff0c;图片尺寸一般会变化。 当我们构建网络时&#xff0c;我们需要确定各个层的参数&#xff0c;而这些参数&#xff0c;则是要提前计算的&…

Jmeter二次开发实操问题汇总(JDK问题,jar包问题)

前提 之前写过一篇文章&#xff1a;https://qa-lsq.blog.csdn.net/article/details/119782694 只是简单尝试了一下生成一个随机手机号码。 但是如果在工作中一个实际场景要用的二次开发&#xff0c;可能会遇到一些问题。 比如这样一个场景&#xff1a; Mobile或者前端调用部分…

OpenSource - 基于Netty的网络扩展库HServer

文章目录 概述官网Hserver的理念特点原理图代码案例HelloWorld 概述 HServer是一个基于Netty开发网络扩展库.使用插件方式来扩展我们的业务 HServer提供 web,gateway,rpc 等插件 同时用户也可以自定义插件&#xff0c;来完成各种各样的业务场景。 官网 https://gitee.com/HSe…

Golang leetcode707 设计链表 (链表大成)

文章目录 设计链表 Leetcode707不使用头节点使用头节点 推荐** 设计链表 Leetcode707 题目要求我们通过实现几个方法来完成对链表的各个操作 由于在go语言中都为值传递&#xff0c;&#xff08;注意这里与值类型、引用类型的而区别&#xff09;&#xff0c;所以即使我们直接在…