三、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 name
   READ getFunction
   [WRITE setFunction]
   [RESET resetFunction]
   [NOTIFY notifySignal]
   [DESIGNABLE bool]
   [SCRIPTABLE bool]
   [STORED bool]
   [USER bool]
   [CONSTANT]
   [FINAL])

(1)创建属性

class QMyWidGet : public QWidget
{
	Q_OBJECT
	Q_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_OBJECT

    Q_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_OBJECT

public:
    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生成的窗体的类

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android学习(三):在Android虚拟机中运行项目

Android学习&#xff08;三&#xff09;&#xff1a;在Android虚拟机中运行项目 一、前期准备 在系统环境变量中添加ANDROID_SDK_HOME&#xff0c;把值指定到一个其他目录。就可以把Android AVD(虚拟机)创建在指定目录下。修改环境变量后&#xff0c;如果Android Studio是在运…

Java Swing手搓童年坦克大战游戏(I)

前言 业余偶尔对游戏有些兴趣&#xff0c;不过这样的时代&#xff0c;硬件软件飞速进步&#xff0c;2D游戏画面都无比精美&#xff0c;之前的8bit像素游戏时代早就过去了&#xff0c;不过那时候有许多让人印象深刻的游戏比如魂斗罗、超级玛丽、坦克大战(Battle City)等等。 学…

1866_FreeRTOS的存储管理方案heap_4分析

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_FreeRTOS: learning notes about FreeRTOS. 1866_FreeRTOS的存储管理方案heap_4分析 对FreeRTOS的heap_4进行分析拆解&#xff0c;按照文学式编程的方式重新组织成个人笔记。 主题由来介绍 free以及malloc这样的存…

辗转相除法求最大公约数

介绍 辗转相除法&#xff08;又称欧几里德算法&#xff09;是一种求最大公约数的算法。它基于这样一个事实&#xff1a;两个数的最大公约数等于较大数和较小数余数的最大公约数。即两个数相除&#xff0c;再将除数和余数反复相除&#xff0c;当余数为0时&#xff0c;取当前除法…

Python异常捕获和处理语句 try-except-else-finally

目录 try-except-else-finally语句 1. 基本用法 2. 多个异常处理 3. 处理所有其他异常 4. 多个except子句 5. 使用else子句 6. 使用finally子句 7. 使用as关键字 实例 例1 例2 例3 例4 例5 例6 例7 例8 结论 try-except-finally语句 在Python中&#xff0c;try-e…

概率论与数理统计 知识点+课后习题

文章目录 &#x1f496; [学习资源整合](https://www.cnblogs.com/duisheng/p/17872980.html)&#x1f4da; 总复习&#x1f4d9; 选择题&#x1f4d9; 填空题&#x1f4d9; 大题1. 概率2. 概率3. 概率4. P5. 概率6. 概率密度函数 F ( X ) F(X) F(X)7. 分布列求方差 V ( X ) …

【STM32】STM32学习笔记-DMA直接存储器存储(23)

00. 目录 文章目录 00. 目录01. DMA简介02. DMA主要特性03. 存储器映像04. DMA框图05. DMA基本结构06. DMA请求07. 数据宽度与对齐08. 数据转运DMA09. ADC扫描模式DMA10. 附录 01. DMA简介 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F…

Hive11_Rank函数

Rank 1&#xff09;函数说明 RANK() 排序相同时会重复&#xff0c;总数不会变 DENSE_RANK() 排序相同时会重复&#xff0c;总数会减少 ROW_NUMBER() 会根据顺序计算 2&#xff09;数据准备 3&#xff09;需求 计算每门学科成绩排名。 4&#xff09;创建本地 score.txt&…

C语言程序设计——数学运算

基本运算符 运算符说明例子赋值运算符a b;、-、*、/、()基本四则运算a (a c) * d;%取余运算符a b % 2&、^、~、l位运算a ~b l c>>、<<左移和右移a b >> 2 在c语言的数学运算中&#xff0c;所涉及到的符号如图所示&#xff0c;在使用过程中应该了…

编程语言的发展趋势和未来方向

1、编程语言的未来&#xff1f; 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; 方…

宋仕强论道之华强北后山寨手机时代(三十六)

今天继续讲华强北山寨手机&#xff0c;跟手机配套周边产品。华强北&#xff0c;作为中国电子产品的集散地和创新中心&#xff0c;一直以来都是电子产品和数码产品的聚集地。在早期&#xff0c;赛格市场以其走私、翻新的电脑和电脑周边产品而闻名。赛格大厦以前5楼以上都是做电脑…

Hive实战:网址去重

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、基于HDFS数据文件创建Hive外部表4、利用Hive SQL实…

11.3编写Linux串口驱动

编写串口驱动主要步骤 构建并初始化 struct console 对象&#xff0c;若串口无需支持 console 可省略此步骤 //UART驱动的console static struct uart_driver virt_uart_drv; static struct console virt_uart_console {//console 的名称&#xff0c;配合index字段使用&…

uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错

背景&#xff1a;uniapp与Java实现的安卓端app支付宝支付&#xff0c;本想先在沙箱测试环境测支付&#xff0c;但一直提示“商家订单参数异常&#xff0c;请重新发起付款。”&#xff0c;接着报错信息就是&#xff1a;{ "errMsg": "requestPayment:fail [pa…

Archlinux下自启动rclone mount

路径&#xff1a; /etc/systemd/system/rclonemount.service [Unit] Descriptionrclonemount Requiresnetwork-online.target.wants Afteralist.service[Service] Typesimple ExecStartPre/bin/mkdir -p /media ExecStart/usr/bin/rclone mount \aliyun: /media \--config /ro…

Video-GroundingDino论文解读

文章目录 前言一、摘要二、引言三、贡献四、模型结构1、模型定义与问题数据少问题模型解决问题模型模块 2、模型结构模型结构图Cross-Modality Spatio-Temporal EncoderLanguage-Guided Query SelectionCross-Modality Spatio-Temporal DecoderPrediction Heads 总结 前言 之前…

冬天夺去的清爽,可爱,春天都会还给你

这款外套上身可太时尚好看了 春天日常穿着或者出行游玩 应对早晚温差&#xff0c;兼具时尚和温度两不误 干净率性闲适的洒脱范整件衣服干净不失细节 下摆有橡筋收紧更加保暖了工艺方面也毫不逊色&#xff0c;防水拉链 四合扣、猪鼻扣一应俱全简直就是一件实用与时尚并存的…

Grind75第2天 | 238.除自身以外数组的乘积、75.颜色分类、11.盛最多水的容器

238.除自身以外数组的乘积 题目链接&#xff1a;https://leetcode.com/problems/product-of-array-except-self 解法&#xff1a; 这个题有follow up&#xff0c; 要求优化到空间复杂度为O(1)&#xff0c;所以给出baseline和follow up的解法。 Baseline&#xff1a;利用索引…

网络报文分析程序的设计与实现(2024)

1.题目描述 在上一题的基础上&#xff0c;参照教材中各层报文的头部结构&#xff0c;结合使用 wireshark 软件&#xff08;下载地址 https://www.wireshark.org/download.html#releases&#xff09;观察网络各层报文捕获&#xff0c;解析和分析的过程&#xff08;如下 图所示&a…

SpringBoot+Redis实现接口防刷功能

场景描述&#xff1a; 在实际开发中&#xff0c;当前端请求后台时&#xff0c;如果后端处理比较慢&#xff0c;但是用户是不知情的&#xff0c;此时后端仍在处理&#xff0c;但是前端用户以为没点到&#xff0c;那么再次点击又发起请求&#xff0c;就会导致在短时间内有很多请求…