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