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

2023-12-09 10:36

本文主要是介绍线性容器(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);       	// 不能格式化输出 %cQList<QByteArray> qblist;	// 不能在这里初始化qblist << "x" << "y";qblist.append("z");for (int i = 0; i < qblist.length(); i++)qDebug() << qblist.at(i);            // 不能格式化输出 %creturn 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;
}

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

这篇关于线性容器(QByteArray、QString、QList模板类)、堆栈窗体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/473468

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

最大流、 最小费用最大流终极版模板

最大流  const int inf = 1000000000 ;const int maxn = 20000 , maxm = 500000 ;struct Edge{int v , f ,next ;Edge(){}Edge(int _v , int _f , int _next):v(_v) ,f(_f),next(_next){}};int sourse , mee

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号