Qt学习笔记(5) — Qt 类库【C++】

2023-05-16

目录

    • 一、Qt核心特点
      • 1. 元对象系统
      • 2. 信号与槽的关联方式
    • 二、Qt全局定义(常用头文件)
      • 1. <QtGlobal\>头文件
        • 1)数据类型定义
        • 2)函数
        • 3)宏定义
    • 三、容器类
      • 1. 顺序容器
        • 1)QList
        • 2)QLinkedList
        • 3)QVector
        • 4)QStack
        • 5)QQueue
      • 2. 关联容器
        • 1)QSet
        • 2)QMap
        • 3)QMUltiMap
        • 4)QHash
        • 5)QMultiHash
    • 四、容器的迭代
      • 1. Java型迭代器
        • 1)顺序容器类的迭代器使用
        • 2)关联容器的迭代器使用
      • 2. STL型迭代器
        • 1)顺序容器的迭代器使用
        • 2)关联容器的迭代器使用
      • 3. foreach关键字


一、Qt核心特点

Qt core是Qt类库的核心,所有其他模块都依赖于此模块,若使用qmake来构建项目,Qt core类里的模块则是被自动加入的;
Qt为C++语言增加的特性,就是在Qt core的模块里实现的吗,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制,属性系统、动态类型转化等。

1. 元对象系统

Qt的元对象系统 提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统:

元对象由一下三个基础组成:

  • QObject类是所有使用元对象系统的类的基类
  • 在一个类的private声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽
  • MOC(元对象编译器)为每个QOject的子类提供必要的代码来实现元对象系统的特性

构建项目时,MOC工具读取C++源文件,发现类中有Q_OBJECT宏时,会为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件被一起被编译和链接

除了信号与槽机制外,元对象还提供了一些功能:

  • QObject::metaObject()函数:返回类关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数,比如 QMetaObject::className() 函数可在运行时返回类的名称字符串:
QObject *obj = new QPushButton;
obj->metaObject()->className();//返回“QPushButton”
  • QMetaObject::newInstance()函数: 创建类的一个实例
  • QObject::inherits(const char* className)函数:判断一个对象实例是否是名称为className的类或QObject的实例
QTimer * timer = new QTimer;
timer->inherits("QTimer");//true
timer->inherits("QObject");//true;
timer->inherits("QAbstructButton");//false 
  • QObject::tr() 和 QObject::trUtf8()函数:可翻译字符串,用于多语言界面设计
  • QObject::setProperty()和QObject::property()函数:用于通过属性名称动态 设置和获取属性值
  • QObject及其子类,还可以使用 qobject_cast() 函数进行动态投射(类似于C++多态调用那样),他并不区分Qt内建类型和用户自定义类型

2. 信号与槽的关联方式

不管是那种类型的connect函数,最后都有一个参数Qt::connectionType type(是个枚举类型,缺省是 Qt::AutoConnection),有以下几种取值:

  • Qt::AutoConnection:若信号的接受者和发送者在同一个线程,就使用Qt::DirectConnection方式;否则使用Qt::queuedConnection方式,在信号发射时自动确定关联方式
  • Qt::DirectConnection:信号被发射时槽函数立即执行,槽函数和信号在同一个线程
  • Qt::queuedConnection:在事件循环回到接收者线程后执行槽函数,槽函数与信号不在一个线程
  • Qt::BlockingQueuedConnection:与Qt::queuedConnection类似,只是信号线程会阻塞知道槽函数执行完毕;当信号与槽函数在同一个线程时绝对不能使用此方式,否则会造成死锁

自定义信号及其使用

信号就是在类定义里声明的一个函数,但这个函数无需实现,只需发射(emit)

class QPerson : public QObject
{
	Q_OBJECT
private:
	int m_age=10;
public:
	void incAge();
signals:
	void ageChanged(int value);
};

信号函数必须是无返回值的函数,但是可以有参数,无需实现,只要在某些条件下发射信号

void QPerson::incAge()
{
	m_age++;
	emit ageChanged(m_age);
}

二、Qt全局定义(常用头文件)

1. <QtGlobal>头文件

<QtGlobal>头文件中包含了Qt类库的一些全局定义,包括基本数据类型、函数和宏,一般的Qt类的头文件都会包含该文件,so可以不用显式的包含次头文件

1)数据类型定义

为了确保在各个平台上各数据类型都有统一确定的长度,Qt为各种常见的数据类型定义了类型符号,如qint8就是signed char的类型定义;

<QtGlobal>中定义的数据类型如下:

在这里插入图片描述
qfloat16是Qt 5.9.0中新增的一个类,用于表示16位的浮点数,要使用的话,需包含<QFloat16>头文件

2)函数

<QtGlobal>包含的一些常用函数的定义,大部分是以模板类型作为参数,返回相应的模板类型,模板类型可以用其他类型替换;

一般要是以double或float为参数的,几乎都有两个参数版本的同名函数

一些常用的全局函数如下所示:
在这里插入图片描述
还有一些基础的数学运算函数在<QtMath>头文件中定义,如三角运算函数、弧度与角度间的黄钻换函数等

3)宏定义

<QtGlobal>中有很多宏定义,常用的宏定义有如下这些:

  • QT_VERSION
    表示Qt编译期版本,比如Qt编译期版本为5.9.0,则QT_VERSION为0x050901;
    常用于条件编译设置,根据Qt版本不同,编译不同的代码段

  • QT_VERSION_CHECK
    是Qt版本号的一个整数表示

  • QT_VERSION_STR
    是Qt版本号的字符串

  • Q_BYTE_ORDER、Q_BIG_ENDIAN、Q_LITTLE_ENDIAN*:
    Q_BYTE_ORDER表示系统内存中数据的字节序,Q_BIG_ENDIAN表示大端字节序,Q_LITTLE_ENDIAN表示小端字节序;
    一般用于判断系统字节序

  • Q_DECL_IMPORT、Q_DECL_EXPORT
    用于导入或导出库的内容,常用与使用或设计共享库

  • Q_DECL_OVERRIDE:用于在类定义中重载一个虚函数,若重载的虚函数没有进行任何重载操作,编译器将会报错

  • Q_DECL_FINAL
    这个宏讲一个虚函数定义为最终级别,不能再被继承,或已定义一个类不能再被继承

  • Q_UNUSED(name)
    该宏用于在函数中定义不在函数体里使用的参数,在函数里要是某变量没有被使用,也没有Q_UNUSED定义,编译期会出现参数未使用的警告

  • foreach(variable,container):
    用于容器类的遍历

  • forever
    用于构造一个无限循环

  • qDebug(const char * message)
    在debugger窗体显式信息,如编译期设置了Qt_NO_BEBUG_OUTPUT,则不做任何输出

三、容器类

Qt提供了多个基于模板的容器类,他们可以用于存储指定类型的数据项;

Qt的容器类比stl的容器类更轻巧、安全和易于使用,他们是隐式共享和可重入的,且他们进行了速度和存储优化,因此可以减少可执行文件的大小;

他们是线程安全的,可以在作为只读容器时被多个线程同时访问;

容器类是基于模板的类,如QList<T>,T是一个具体的类型,可以是int、float等简单类型,也可以是QString、QDate等类,但不能是QObject或其任何子类,T必须是一个可赋值的类型,即T必须提供一个缺省的构造函数,一个可拷贝构造函数和一个赋值运算符

Qt容器类分为顺序容器和关联容器;Qt还提供了foreach宏用于遍历容器内的所有数据项

1. 顺序容器

1)QList

QList是最常用的容器类,以数组列表形式实现,在其前面和后面增添数据很快,以下标方式访问数据项,也提供at()函数;

成员函数有:insert()、replace()、removeAt()、move()、swap()、append()、prepend()、removeFirst()和 removeLast()等;

2)QLinkedList

他是链式列表,数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同;

他不提供基于下标的访问方式,其余接口与QList基本相同

3)QVector

提供动态数组功能,以下标索引访问数据;

函数接口几乎与QList基本相同,QVector<T> 比 QList<T> 的性能更好,因为它的数据项是连续存储的

4)QStack

类似于堆栈的具有先进后出特性的容器类,push()和pop()是主要的接口函数;

#include <QStack>
#include <QDebug>
void TestQStack()
{
    QStack<int> stack;
    stack.push(10);
    stack.push(20);
    stack.push(30);
    while (!stack.isEmpty())
       qDebug()<< stack.pop();//30 20 10
}

5)QQueue

类似于队列的具有先进先出特性的容器类,enqueue()和dequeue()是主要的操作函数;

#include <QQueue>
#include <QDebug>
void TestQQueue()
{
    QQueue<int> queue;
    queue.enqueue(10);
    queue.enqueue(20);
    queue.enqueue(30);
    while (!queue.isEmpty())
        qDebug()<< queue.dequeue();//10 20 30
}

2. 关联容器

1)QSet

是基于散列表的集合模板类,存储数据的顺序是不定的,查找值的速度非常快;

QSet<T>内部就是QHash实现的;

#include <QSet>
#include <QDebug>
void TestQQueue()
{
    QSet<QString> set;
    set<<"dog"<<"cat"<<"tiger";
    if(!set.contains("cat"))
    {
    	qDebug<<"容器内不包含cat";
    }
}

2)QMap

QMap<key,T>提供一个字典(关联数组),一个键映射到一个值;

QMap存储数据时按照键的顺序,若不在乎存储顺序,建议使用QHash更快;

#include <QMap>
#include <QDebug>
void TestQMap()
{
    //QMap存储数据是按照键的顺序
    QMap<int,char> _map;
    for(int i=97;i<123;i++)
    {
        _map[i]=i;
    }
    foreach(char c,_map)
    {
         qDebug()<<c;//按顺序a b c...输出
    }
    qDebug()<<_map[100];//d
    char upper_a=_map.value(65,'A');
    qDebug()<<upper_a;//A
}

若在映射表中没有找到指定的键,会返回一个缺省构造值,如,若值得类型是字符串,会返回一个空字符串;

在使用value()查找键值时,还可以指定一个缺省的返回值:

timeout=map.value("TIMEOUT",30);

表示如果在map里找到键“TIMEOUT”了就返回关联的值,未找到就返回30

3)QMUltiMap

他是QMap的子类,用于处理多值映射的便利类;

QMultiMap不提供[]操作符,使用value()函数访问最新插入的键的单个值,若要获取一个键对应的值所有值,使用values()函数,返回值是QList<T>类型;

#include <QMultMap>
#include <QDebug>
void TestQMultiMap()
{
    QMultiMap<char,QString> _multiMap;
    //QMultiMap 不提供“[]”操作符
    //_multiMap['0']="ss";
    _multiMap.insert('*',"pointer");
    _multiMap.insert('*',"all");
    _multiMap.insert('*',"multiplication sign");
    qDebug()<<_multiMap.value('*');//最新的值 multiplication sign
    QList<QString> _list=_multiMap.values('*');
    foreach(QString str,_list)
    {
        qDebug()<<str;//"multiplication sign"
                      //"all"
                      //"pointer"
    }
    for(int i=0;i<_list.size();i++)
    {
        qDebug()<<_list[i];//"multiplication sign"
                           //"all"
                           //"pointer"
    }
}

4)QHash

他是基于散列表来实现字典功能的模板类,具有非常快的查找速度;

QHash的数据项是无序的,QHash必须提供“==”运算符和一个QHash()的全局散列函数;

5)QMultiHash

QMultiHash 是 QHash 的子类,是用于处理多值映射的便利类,其用法与 QMultiMap 类似

四、容器的迭代

Qt有两种类型的迭代器:Java型迭代器 和 STL型迭代器

1. Java型迭代器

Qt提供有以下几种迭代器,对于每个容器类,有两个Java型迭代器,一个只读迭代器,一个读写迭代器:

容器类只读迭代器读写迭代器
QList<T>, QQueue<T>QListIterator<T>QMutableListIterator<T>
QLinkedList<T>QLinkedListIterator<T>QMutableLinkedList<T>
QVector<T>, QStack<T>QVectorIterator<T>QVectorMutableIterator<T>
QSet<T>QSetIterator<T>QSetMutableIterator<T>
QMap<T>, QMultiMap<T>QMapiterator<T>QMutaleMapIterator<T>
QHash<T>, QMultiHash<T>QHashIterator<T>QMutableHashIterator<T>

1)顺序容器类的迭代器使用

Java类型的迭代器的指针不是指向一个数据项,而是指向数据项之间的位置:
在这里插入图片描述

QListIterator常用函数

  • void toFront():迭代器移动到列表的最前面(第一个数据项之前)
  • void toBack():迭代器移动到列表的最后面(最后一个数据项之后)
  • bool hasNext():若迭代器不位于最后位置,返回true
  • bool hasPrevious():若迭代器不位于最前面的位置,返回true
  • const T & next():返回下一个数据项,并且迭代器后移一个位置
  • const T & peekNext():返回下一个数据项,但迭代器不移动
  • const T & previous():返回前一个数据项,并且迭代器前移一个位置
  • const T & peekPrevious():返回前一个数据项,但迭代器不移动

QMutableListIterator是读写迭代器,可用于修改容器中的数据;

remove()函数移除next()函数刚刚跳过去的数据项,不会使迭代器失效;

setValue()函数可以修改刚刚跳过去的数据项的值;

#include <QList>
void Test()
{
	QList<QString> list;
	list<<"A"<<"B"<<"C"<<"D";
	QListIterator<QString> i(list);
	while(i.hasNext())
	{
		qDebug<<i.next();
	}	
	//反向遍历
	i.toBack();
	while(i.hasPrevious())
	{
		qDebug()<<i.previous();
	}	

	//读写迭代器
	QList<int> list2;
	list2<<1<<2<<3<<4<<5;
	QMutableListIterator<int> it(list2);
	while(it.hasNext())
	{
		if(it.next() % 2==0)
		{
			it.remove();
		}
	}
}

2)关联容器的迭代器使用

对于关联容器的迭代器,普通函数接口同顺序性容器的哪些基本类似,主要是增加了key()和value()函数用于获取刚刚跳过的数据项的键和值;

void Test()
{
	QMap<QString,QString> map;
	map.insert("Paris","France");
	map.insert("New York","USA");
	map.insert("Mexico City","USA");
	//...
	QMutableMapIterator<QString,QString> i(map);
	while(i.hasNext())
	{
		if(i.next().endsWith("City"))
		{
			i.remove();
		}
	}
}

若是在多值容器里遍历,可用findNext()或 findPrevious()查找:

QMutableMapIterator<QString,QString> i(map);
while(i.findNext("USA"))
{
	i.remove();		
}

2. STL型迭代器

STL迭代器与Qt和STL的原生算法兼容,并且进行了速度优化,,因此它的效率更高;

类似的,对于每个容器类,也有两个STL型迭代器:比如对于QList<T>, 则有只读迭代器QList<T>::const_iterator 和 读写迭代器QList<T>::iterator;

STL型迭代器是数组的指针,所以“++”运算符使迭代器指向下一个数据项,“*”运算符返回数据内容:
在这里插入图片描述
end()函数指向一个虚拟的表示结尾的数据项,实际是无效的,一般作为循环结束条件;

1)顺序容器的迭代器使用

constBegin()和constEnd()是用于只读迭代器的,表示起始位置和结束位置;

QList<QString> list;
list<<"A"<<"B"<<"C"<<"D";
QList<Qstring>::const_iterator i;
for(i=list.constBegin();i!=list.constEnd();++i)
{
	qDebug<< *i;
}
//使用反向读写迭代器
QList<QString>::reverse_iterator i2;
for(i2=list.rbegin();i2!=list.rend();++i2)
{
	*i=i->toLower();
}

2)关联容器的迭代器使用

对于关联容器类QMap 和 QHash,迭代器的“*”操作符返回数据项的值,若想返回键,则用key()函数,对应的value()函数返回值:

QMap<int,int> map;
//....
QMap<int,int>::const_iterator i;
for(i=map.constBegin();i!=map.constEnd();++i)
{
	qDebug()<<i.key()<<":"<<i.values();
}

3. foreach关键字

如只是需要遍历容器,则可以使用foreach关键字;

foreach的语法是:foreach (variable,container)

QLinkedList<QString> list;
...
QString str;
foreach(str,list)
{
	qDebug()<<str;
}

//第二种方式
foreach(const QString &str,liat)
{
	qDebug()<<str;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt学习笔记(5) — Qt 类库【C++】 的相关文章

  • 人工智能概述

    目录 什么是人工智能实现人工智能的方法逻辑编程机器学习深度学习机器学习和深度学习的区别 人工智能的分类如何实现人工智能 什么是人工智能 人工智能 又被称为机器智能 xff0c 是一种综合计算机科学 统计学 语言学等多种学科 xff0c 使机
  • 2019了,转行学编程过时了吗?

    最近 xff0c 我的一篇文章 现在学Java的人都是傻子 引起了一些网友讨论 xff0c 都在说现在学Java过时了 xff0c Java市场趋于饱和了 xff0c 应该弃学Java xff0c xff0c 难道Java编程真的过时了 x
  • 什么是用户态和内核态?用户态和内核态是如何切换的?

    3 什么是用户态和内核态 xff1f 用户态和内核态是操作系统的两种运行状态 xff0c 操作系统主要是为了对访问能力进行限制 xff0c 用户态的权限较低 xff0c 而内核态的权限较高 用户态 xff1a 用户态运行的程序只能受限地访问
  • ubuntu安装Clamav

    一 简介 Clam AntiVirus是一个类UNIX系统上使用的反病毒软件包 主要应用于邮件服务器 xff0c 采用多线程后台操作 xff0c 可以自动升级病毒库 ClamAV是一个在命令行下查毒软件 xff0c 因为它不将杀毒作为主要功
  • 什么是上下文切换?

    上下文切换指的是内核操作系统的核心在CPU上对进程或者线程进行切换 搞清楚上下文切换需要先搞清楚什么是上下文 CPU在开始执行任务时需要先知道从哪里去加载任务 xff0c 从哪里开始执行 xff0c 上下文的作用就是告诉CPU这些 xff0
  • ubuntu16.04下,ROS+PX4+QGC安装

    ubuntu16 04下 xff0c ROS 43 PX4 43 QGC安装 ROS安装 xff1a 第一步 xff1a ROS安装前准备工作 1 在Ubuntu系统上 xff0c 确认git已经安装 span class token fu
  • TokenEndpoint : Handling Null Pointer Exception

    springboot oauth2 0生成token时报错 详细的日志没有打印出来 需要手动配置log 64 Override public void configure AuthorizationServerEndpointsConfig
  • linux(ubuntu)无法连接网络

    提示 xff1a 版本 xff1a ubuntu16 0 4 问题 xff1a 开机没有网络 xff0c 无法连接网络 xff0c 尝试了很多方法最终才可以 首先查看ifconfig 查看网卡信息 ifconfig 查看ip ip a 查看
  • 八皇后问题

    问题描述 在国际象棋中 xff0c 有一个非常强势的棋子 皇后 xff0c 他的走法可以在网上参考一下 xff0c 概括来说就是可以沿着行 列 与对角线平行的线走 而在计算机中有一个关于他的经典问题 xff0c 8皇后 xff0c 就是在8
  • ubuntu18.04.3如何在终端下切换到指定文件夹或根目录

    看到很多的新手 xff0c 不知道如何在终端切换到根目录的 xff0c 或者是指定的目录的 xff0c 下面介绍一下切换的方法 1 先按键盘 ctrl 43 alt 43 t 弹出终端 xff0c 那么你会看到终端上的提示当前目录为 这个就
  • MySql简单查询——单表查询

    一 DDL xff08 Data Definition Language xff09 xff1a 数据定义语言 xff0c 用来定义数据库对象 xff1a 库 表 列等 xff1b 相关字段 xff1a create drop alter
  • linux下可视化git工具git-cola安装与使用(HTTP方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • 解决ubuntu下应用程序菜单不在程序的左上角

    测试版本 xff1a ubuntu16 04 问题 xff1a 应用程序菜单不在程序的左上角 xff0c 默认放在了桌面顶部的菜单栏上 如下 xff1a 解决办法 xff1a System Settings gt Appearance gt
  • linux下可视化git工具git-cola安装与使用(SSH方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • CAS实现SSO单点登录原理

    yale cas可以百度一下 xff0c 这是学习cas后的一点总结 xff0c 以备日后使用 xff01 安全性 xff1a 用户只须在cas录入用户名和密码 xff0c 之后通过ticket绑定用户 xff0c 在cas客户端与cas校
  • 五种知网文献免费下载方式

    1 idata中国知网 网址 xff1a idata中国知网 进入系统 xff0c 注册账号 xff0c 登录即可 每天五篇额度 xff0c 基本够用 xff0c 可注册多个账号使用 2 上海研发公共服务平台 网址 xff1a 上海研发公共
  • 【FreeRTOS】二值信号量实现线程的同步

    FreeRTOS 二值信号量实现线程的同步 测试环境如下 stm32L431RCT6 MDK keil5 stm32cube 43 FreeRTOS 一 添加多个任务 1 引脚配置 LED使用的引脚PA8和PB2设置成output 将按键引
  • 暗影精灵2pro安装win10+ubuntu16.10双系统

    暗影精灵2pro预装win10家庭版 xff0c 默认启动win10系统 xff0c 且无法引导其他系统 xff0c 今天我们来解决这个问题 先进入到win10的磁盘管理器服务 xff0c 为ubuntu单独分配磁盘空间 xff0c 让wi
  • 第二十三讲.从HadoopURL中读取数据

    视频 xff1a 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 视频笔记 从hadoop URL读取数据 static URL setURLStreamH
  • winform窗体

    一 winform介绍 WinForm xff0c 是 Net开发平台中对Windows Form的一种称谓 WinForm是窗体应用程序 xff0c 由若干个窗体应用组成 xff0c 基于C S架构 二 winform的使用 xff08

随机推荐

  • 赋予人工智能记忆的人,带你梳理深度学习核心算法

    新智元翻译 1 来源 xff1a Idsia 作者 xff1a J rgen Schmidhuber 翻译 xff1a 张巨岩 作者介绍 xff1a J rgen Schmidhuber 被称为是赋予人工智能记忆的人 xff0c 递归神经网
  • C++实现贪吃蛇游戏

    注意 xff1a 本代码是在VC 43 43 6 0环境下编译的 xff0c 在其他环境如codeblocks下运行可能会产生意想不到的问题 xff0c 请尽量使用VC xff01 最近由于小编闲着慌 xff0c 捣鼓了一个贪吃蛇游戏 xf
  • Win10正式版19044.2132(KB5020435)来啦!(附完整更新日志)

    微软发布了Win10正式版KB5020435 xff08 操作系统内部版本 19042 2132 19043 2132 和 19044 2132 xff09 xff0c 此次更新主要解决了某些类型的安全套接字层 xff08 SSL xff0
  • SOUI总结之皮肤说明

    皮肤说明 说明 框架自带的皮肤都是 skin sys XXXX开始 xff0c 自带的皮肤存放位置trunk soui sys resource theme sys res xff0c 图片和名称映射关系可以打开trunk soui sys
  • C++中逗号运算符

    今天测试代码的时候 xff0c 遇到一行代码出现了疑问 xff0c 原因是出现了自减运算符和逗号运算符 xff0c 这就涉及到一个顺序的问题 xff0c 于是写了一个C 43 43 小程序 xff0c 验证了一下这个想法 include u
  • PsExec的问题及其解决办法

    C gt PsExec exe 192 168 1 142 cmd PsExec v1 98 Execute processes remotely Copyright C 2001 2010 Mark Russinovich Sysinte
  • ubuntu 18.04安装protobuf

    今天需要安装protobuf 在网上搜了一篇教程 xff0c 但是篇幅太长 xff0c 于是对其进行简化一下 原文 1 96 96 96 git clone https github com protocolbuffers protobuf
  • 读取配置文件的程序

    时常会遇到需要从配置文件中读取一些信息 xff0c 这里就提供一个例子 xff0c 方便日后使用 xff1a span class token comment ini h span span class token macro proper
  • 命令行读取参数

    有时需要从命令读取一些输入 xff0c 这里找到一个方法 xff0c 怎么实现的没有仔细研究 xff0c 但是可用 cmdline h span class token comment Copyright c 2009 Hideyuki T
  • 如何在一个shell脚本中开启多个应用程序?

    之前在csdn上搜索 xff0c 提示用gnome terminal指令 xff0c 但是发现怎么都不好使 于是找到一种解决方案 span class token comment bin bash span span class token
  • 使用openCV播放视频 在视频中加入滑动条

    include 34 opencv2 highgui highgui hpp 34 include 34 opencv2 imgproc imgproc hpp 34 include lt iostream gt include lt fs
  • Linux下vscode无法查看定义?

    今天要用到vscode查到c 43 43 程序 但是发现vscode无法查看程序的定义 于是找了一下解决方法 vscode无法转到定义可能是因为没有安装插件 由于我需要使用C 43 43 所以我这里安装的是C 43 43 插件 第一步 第二
  • 冒泡排序的实现(基于顺序表)

    对于冒泡排序的含义以及图示表示 这里就不再赘述 这篇博客已经说的很明白了 添加链接描述 于是就用代码实现了一下基于顺序表的冒泡排序 因为一直看的时大话数据结构这本书 于是把上面介绍的三种实现方法都在代码中实现一下 具体实现与书中有一些出入
  • ambiguating new declaration of 问题的解决

    今天在运行代码的时候 一直在报这样的错误 ambiguating new declaration of int NewPartition seqlist int int 查看了许久 原来是头文件中的声明类型与函数实现的声明类型不一致造成的
  • opencv中的MatConstIterator,NAryMatIterator迭代器的使用

    第一个迭代器 MatConstIterator迭代器 使用迭代器计算一个三通道三维数组中 34 最长元素 34 这个代码实现过程中 照着书中的代码抄下来一直报错 后来在查阅代码的时候 发现了问题所在 具体已经在代码中标明了 include
  • 用python实现查询天气的功能

    附上代码 import urllib request import gzip import json print 39 天气查询 39 def get weather data city name 61 input 39 请输入要查询的城市
  • 1.Docker 安装

    安装 wget 命令 yum install wget 安装docker wget q O https get docker com sh O 下载并以指定的文件名保存 以 39 39 作为file参数 xff0c 那么数据将会被打印到标准
  • linux下sudo apt-get update 报Err http://security.ubuntu.com precise-security InRelease 等

    今天在进行linux更新的时候一直报错 尝试了很多办法都不行 于是找到一个方法 切实可行 以根用户运行 cd var lib apt lists rm rm var cache apt archives lock rm var lib dp
  • HTTP Authentication之Basic认证、Digest认证

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 109691608 前面说到 Fiddler 的QuickExec Filter
  • Qt学习笔记(5) — Qt 类库【C++】

    目录 一 Qt核心特点1 元对象系统2 信号与槽的关联方式 二 Qt全局定义 xff08 常用头文件 xff09 1 lt QtGlobal gt 头文件1 xff09 数据类型定义2 xff09 函数3 xff09 宏定义 三 容器类1