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;
}
效果展示