线性容器(QByteArray、QString、QList模板类)、堆栈窗体

QT 线性容器

点击查看:字符和字节的区别,ASCII、Unicode 和 UTF-8 编码的区别。(👈 安全链接,放心跳转)
在这里插入图片描述

QByteArray

思考:char buf[6] = “hello”;
如果 C 语言中要利用 buf 内容重新生成 “hello world” 字符串,该怎样做?

char dest[16] = {0};

// 方法一
strcat(dest, buf);
strcat(dest, " world");

// 方法二
sprintf(dest, "%s world", buf);

Qt 通过 QByteArray 为我们提供了一个可变长的字节数组容器。主要用来存储原始的字节流
QByteArray 仍可以表示字符串,类似于 unsigned char buf[],但是 Qt 中多用 QString 来表示字符串。
QByteArray 一般结合其它类使用,比如 QIODevice 类的 QByteArray QIODevice::readAll()。

QByteArray(const char *data, int size = -1);  		// 构造函数
char	at(int i) const; 							// 返回第i个元素
void	clear();  									// 清空
bool	contains(const char * str) const;  			// 是否包含字符串  <==> strstr
bool	contains(char ch) const; 					// 是否包含字符
char 	*data();  									// 从 QByteArray 类型转化为 char *

int	indexOf(const char *str, int from = 0);		// 查找 从 from 开始第一次匹配 str 的位置
QByteArray & append(char ch);  					// 尾部增加
QByteArray & prepend(char ch); 					// 头部增加
int	length() const;  							// 返回长度
QByteArray &remove(int pos, int len);  			// 删除

💡

QByteArray 定义一个字符串 “my”,使用 qDebug 输出每个字符。
在其前增加 "Welcome to ",其后增加 " world. ",验证新字符串中是否包含 “we” 字符串。
删除从 “world” 字符串后的所有字符。

// main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QByteArray arr("my");
    arr.prepend("Welcome to ");
    arr.append(" world. ");
    qDebug() << arr;
    for (int i = 0; i < arr.length() / 5; i++)		// 字符太多,显示前几个
        qDebug("0x%x", arr.at(i));

    qDebug() << arr.contains("we");
    qDebug() << arr.contains("We");					// 大小写敏感

    arr.remove(arr.indexOf("world")+5, arr.length());
                        // 若要删除 含 "world" 在内的、其后所有字符,去掉 +5
                        // 第二个参数写长些,可以多于字符串中剩余字符的个数,不会报错
    qDebug() << arr;

    return 0;
}

在这里插入图片描述

QString

QString 类提供了一个 Unicode 文本和经典的 C语言 以 ‘\0’ 结尾的字符数组的抽象。

数字转字符串

QString	number(long n, int base = 10) [static];
QString	number(double n, char format = 'g', int precision = 6) [static];

e.g.
long a = 63;
QString s = QString::number(a, 10); // s == “63”
QString t = QString::number(a, 16).toUpper(); // t == “3F”
QByteArray 同理。

字符串转数字

short	 toShort(bool * ok = 0, int base = 10) const;
float	 toFloat(bool * ok = 0) const;
long	 toLong(bool * ok = 0, int base = 10) const;
// 也可以 toInt

e.g.
QString str1 = “1234.56”;
float a = str1.toFloat(); // a == 1234.56
QByteArray 同理。

QString 转 QByteArray

QByteArray toLocal8Bit() const;
QByteArray toUtf8() const;

QByteArray 转 char *

char 	*data();

QString 通过 QByteArray 间接转 char *

QString 没有直接转换为 char * 的方法,需要中间经过一层 QByteArray 的过渡。

char 	*dest = src.toLocal8Bit().data();
char    *dest = src.toUtf8().data();

QList 模板类

QList(const QList<T> & other);
QList<T> &	operator<<(const QList<T> & other);

💡

定义一个 int 类型的 QList,初始化为1、2、3,再增加 4。
定义一个 QString 类型的 QList,只需要把 改为 ,再初始化。

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
   QList<int> list;				// 不能在这里初始化
   list << 1 << 2 << 3;
   list.append(4);
   qDebug() << list;            // 不能这样写:qDebug(list);

   QList<QString> strlist;  	// 不能在这里初始化
   strlist << "b" << "c" << "d";
   strlist.prepend("a");
   for (int i = 0; i < strlist.length(); i++)
        qDebug() << strlist.at(i);       	// 不能格式化输出 %c

   QList<QByteArray> qblist;	// 不能在这里初始化
   qblist << "x" << "y";
   qblist.append("z");
   for (int i = 0; i < qblist.length(); i++)
       qDebug() << qblist.at(i);            // 不能格式化输出 %c

    return 0;
}

在这里插入图片描述

堆栈窗体

QStackedWidget

Public Functions:
	QStackedWidget(QWidget * parent = 0);
    	如果单纯指定父窗口,但是没有指定大小,那么是不显示的
	
	int	addWidget(QWidget * widget);
		增加窗体,增加完后默认会分配一个 index值,从 0 开始
	int	currentIndex() const;
		获取当前显示窗体的 index值


Public Slots:
	void	setCurrentIndex(int index);
		设置 第index 个页面为栈顶(显示页面) 			// 一般用这个
	void	setCurrentWidget(QWidget *widget); 


Signals:
	void currentChanged(int index);
		窗体发生变化后,发出信号,index 代表更换后窗体 index 值

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

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // 初始化三个窗体
    QWidget *firstPageWidget = new QWidget;
    QWidget *secondPageWidget = new QWidget;
    QWidget *thirdPageWidget = new QWidget;

    // 在三个窗体分别设置三个按钮
    QPushButton *btn1 = new QPushButton("Page 1", firstPageWidget);
    QPushButton *btn2 = new QPushButton("Page 2", secondPageWidget);
    QPushButton *btn3 = new QPushButton("Page 3", thirdPageWidget);

    // 实例化堆栈窗体对象,把窗体添加到堆栈窗体
    QStackedWidget *stackedWidget = new QStackedWidget;
    stackedWidget->addWidget(firstPageWidget);
    stackedWidget->addWidget(secondPageWidget);
    stackedWidget->addWidget(thirdPageWidget);


//    QListWidget *listWidget = new QListWidget;
//    QListWidgetItem *firstItem = new QListWidgetItem(tr("First"), listWidget);
//    QListWidgetItem *secondItem = new QListWidgetItem(tr("Sencond"), listWidget);
//    QListWidgetItem *thirdItem = new QListWidgetItem(tr("Third"), listWidget);

//    listWidget->insertItem(0, firstItem);
//    listWidget->insertItem(1, secondItem);
//    listWidget->insertItem(2, thirdItem);					// 两种方法都可以,方法一

    
    QListWidget *listWidget = new QListWidget;				// 方法二
    listWidget->addItem(tr("First"));
    listWidget->addItem(tr("Sencond"));						// 多打了个 n,请忽略
    listWidget->addItem(tr("Third"));


    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(listWidget, 1);
    layout->addWidget(stackedWidget, 3);
    this->setLayout(layout);

    connect(listWidget, SIGNAL(currentRowChanged(int)), stackedWidget, SLOT(setCurrentIndex(int)));
    // 堆栈窗体的槽是确定的 —— setCurrentIndex(int),也就意味着对应信号的参数也必须和槽匹配
    this->resize(960, 600);

}

Widget::~Widget()
{
}

在这里插入图片描述

UI 实现堆栈窗体

在这里插入图片描述

布局部分

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

信号与槽

该部分可用代码实现,也可用 UI 实现。

UI 实现

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

代码实现(widget.cpp)
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QObject::connect(ui->listWidget, SIGNAL(currentRowChanged(int)), \
                                        ui->stackedWidget, SLOT(setCurrentIndex(int)));
}

Widget::~Widget()
{
    delete ui;
}

效果展示
在这里插入图片描述

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

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

相关文章

视觉学习笔记12——百度飞浆框架的PaddleOCR 安装、标注、训练以及测试

系列文章目录 虚拟环境部署 参考博客1 参考博客2 参考博客3 参考博客4 文章目录 系列文章目录一、简单介绍1.OCR介绍2.PaddleOCR介绍 二、安装1.anaconda基础环境1&#xff09;anaconda的基本操作2&#xff09;搭建飞浆的基础环境 2.安装paddlepaddle-gpu版本1&#xff09;安装…

matlab RGB三元组和十六进制的转换

matlab画柱状图改颜色的时候&#xff0c;用三元组的形式&#xff0c;范围是[0&#xff0c;1] 我们获得了十六进制 到网站转换为[0,255] https://c.runoob.com/front-end/55/ 然后将得到的值/255 输入matlab就可以了

android 13.0 去掉recovery模式UI操作页面的菜单选项

1.概述 在13.0进行系统rom定制化开发中,在进行一些定制化开发中,会根据需要在进入recovery模式的时候,去掉recovery模式的一些菜单选项, Reboot to bootloader,Enter rescue等菜单项,经过分析得知, 就是在device.cpp去掉一些菜单选项就可以了,接下来就来分析实现相关功…

Halcon联合winform显示以及处理

在窗口中添加窗体和按钮&#xff0c;并在解决方案资源管理器中调加了导入Halcon导出的.cs文件&#xff0c;运行出现下图的问题&#xff1a; 问题1&#xff1a;CS0017 程序定义了多个入口点。使用/main(指定包含入口点的类型&#xff09;进行编译。 解决方案1.&#xff1a; 右…

running小程序重要技术流程文档

一、项目文件说明&#xff1a; &#xff08;注&#xff1a;getMyMoney无用已删除&#xff09; 二、重要文件介绍 1.reinfo.js&#xff1a;位于utils文件下&#xff0c;该文件封装有统一的请求URL&#xff0c;和请求API同意封装供页面调用&#xff1b;调用时候需要在页面上先…

有哪些已经上线的vue商城项目?

前言 下面是一些商城的项目&#xff0c;需要练手的同学可以挑选一些来练&#xff0c;废话少说&#xff0c;让我们直接开始正题~~ 1、newbee-mall-vue3-app 是一个基于 Vue 3 和 TypeScript 的电商前端项目&#xff0c;它是 newbee-mall 项目的升级版。该项目包含了商品列表、…

Linux--权限问题(1)

前文 Linux--初识和基本的指令&#xff08;1&#xff09;-CSDN博客 Linux--初识和基本的指令&#xff08;2&#xff09;-CSDN博客 Linux--初识和基本的指令&#xff08;3&#xff09;-CSDN博客 目录 前文 前言 1.剩余指令部分 1.1 打包和压缩的其它指令 2.权限部分 2.1权…

Python面向对象基础

Python面向对象基础 一、概念1.1面向对象的设计思想1.2 面向过程和面向对象1.2.1 面向过程1.2.2 面向对象1.2.3 面向过程和面向对象的优缺点 二、类和对象2.1 概念2.2 类的定义2.3 对象的创建2.3.1 类中未定义构造函数2.3.2 类中定义构造函数 2.4 类的设计 三、类中的成员3.1 变…

交付《啤酒游戏经营决策沙盘》的项目

感谢首富客户连续两年的邀请&#xff0c;交付《啤酒游戏经营决策沙盘》的项目&#xff0c;下周一JSTO首席学习官Luna想让我分享下系统思考与投资理财&#xff0c;想到曾经看过的一本书《深度思维》&#xff0c;看到一些结构来预判未来。不仅仅可以应用在企业经营和组织发展上&a…

Java Web应用小案例 - 实现用户登录功能

文章目录 一、使用纯JSP方式实现用户登录功能&#xff08;一&#xff09;项目概述&#xff08;二&#xff09;实现步骤1、创建Web项目2、创建登录页面 二、使用JSPServlet方式实现用户登录功能三、使用JSPServletDB方式实现用户登录功能 一、使用纯JSP方式实现用户登录功能 &a…

tomcat篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、tomcat容器是如何创建servlet类实例?用到了什么原理?二、tomcat 如何优化?三、熟悉tomcat的哪些配置?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女…

认识 Redis - Redis 的安装与下载

Redis 从今天开始&#xff0c;我们迎接一个全新的专栏 - Redis 专栏。 相信我们在日常的学习中&#xff0c;肯定也是对 Redis 早有耳闻&#xff0c;今天我们还是先来了解一下 Redis 是什么&#xff1f;以及 Redis 应该怎么使用&#xff1f;… 1. Redis 是什么&#xff1f; …

React中使用react-json-view展示JSON数据

文章目录 一、前言1.1、在线demo1.2、Github仓库 二、实践2.1、安装react-json-view2.2、组件封装2.3、效果2.4、参数详解2.4.1、src(必须) &#xff1a;JSON Object2.4.2、name&#xff1a;string或false2.4.3、theme&#xff1a;string2.4.4、style&#xff1a;object2.4.5、…

Word插件-好用的插件-一键设置字体--大珩助手

常用字体 整理了论文、公文常用字体 整理了常用的论文字体&#xff0c;可一键设置当前节或选择的文字的字体 字体设置 包含字体选择、字体颜色 特殊格式 包含首字下沉、段落分栏、统一宽度、双行合一、上标切换、下标切换、转为全角、转为半角、挖词填空、当前日期、大写金…

Selenium+Unittest+HTMLTestRunner框架更改为Selenium+Pytest+Allure(二)

1 代码框架 整体项目结构如图&#xff1a; Common&#xff1a;公共库 Logs&#xff1a; 日志目录 Page&#xff1a; 页面元素 Report&#xff1a;测试报告 TestCase&#xff1a;测试用例 TestData&#xff1a; 测试数据 2 单模块运行 直接上代码&#xff1a; # -*- coding…

【C++学习手札】基于红黑树封装模拟实现map和set

​ &#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 &#x1f49c;本文前置知识&#xff1a; 红黑树 ♈️今日夜电波&#xff1a;漂流—菅原纱由理 2:55━━━━━━️&#x1f49f;──────── 4:29 …

学生护眼灯哪个牌子好?适合学生考研用的台灯推荐

不知道各位家长们有没有对孩子的视力健康关注过&#xff0c;如今中国近视的总人数接近6亿人口&#xff01;而我国儿童青少年近视比率更是超过了一半&#xff0c;达到了52.7%的近视率&#xff0c;也就是说每十个儿童青少年中就有五个是存在视力问题的。其中很大的原因就是长时间…

docker资源限制

目录 系统压力测试工具stress 1. cpu资源限制 1.1 限制CPU Share 1.2 限制CPU 核数 1.3 CPU 绑定 2. mem资源限制 3. 限制IO 二、端口转发 三、容器卷 四、部署centos7容器应用 五、docker数据存储位置 六、docker网络 容器网络分类 在使用 docker 运行容器时&…

办公人员必备简单拉伸操,为了保护自己的颈椎,赶快练起来吧

目录 一、办公人员必备简单拉伸操的必要性 二、教程介绍 第一节&#xff1a;双掌擦颈 第二节&#xff1a;左右转头 第三节&#xff1a;前后点头 第四节&#xff1a;旋肩舒颈 第五节&#xff1a;颈项争力 第六节&#xff1a;头部旋转 第七节&#xff1a;头手相抗 第八…

有一篇文章,共有3行文字,每行有80个字符。要求分别统计其中英文大写字母、小写字母、数字、空格以及其他字符的个数

目录 1解题思路&#xff1a; 2代码&#xff1a; 3运行代码&#xff1a; 4总结&#xff1a; 1解题思路&#xff1a; 有一篇文章&#xff0c;共有3行文字&#xff0c;每行有80个字符。要求分别统计其中英文大写字母、小写字母、数字、空格以及其他字符的个数 首先先设置一个字…
最新文章