C++ Qt開發:StringListModel字符串列表映射組件
Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹QStringListModel字符串映射組件的常用方法及靈活運用。
QStringListModel 是 Qt 中用于處理字符串列表數據的模型類之一,它是 QAbstractListModel 的子類,用于在 Qt 的視圖類(如 QListView、QComboBox 等)中顯示字符串列表。該組件是用于在Qt中快速顯示字符串列表的便捷模型類。該組件通常會配合ListView一起使用,例如將ListView組件與Model模型綁定,當ListView組件內有數據更新時,就可以利用映射將數據模型中的數值以字符串格式提取出來,同理也可實現將字符串賦值到指定的ListView組件內。
以下是對 QStringListModel 的概述:
- 繼承關系:
QStringListModel繼承自QAbstractListModel。 - 用途:
QStringListModel主要用于將字符串列表(QStringList)與視圖進行綁定,使得這些字符串可以在視圖中顯示和管理。 - 特點:
- 可以通過
setStringList方法設置字符串列表。 - 提供了獲取和設置數據的接口,可以通過模型索引訪問和修改數據。
- 適用于顯示簡單的字符串列表,不涉及復雜的數據結構。
- 可以通過
- 常見操作:
- 設置字符串列表: 使用
setStringList方法設置要在視圖中顯示的字符串列表。 - 獲取字符串列表: 使用
stringList方法獲取當前模型中的字符串列表。 - 訪問和修改數據: 可以使用模型索引通過
data方法獲取數據,通過setData方法修改數據。
- 設置字符串列表: 使用
以下是 QStringListModel 的一些常用方法,說明以及概述,按表格形式呈現:
| 方法 | 描述 |
|---|---|
QStringListModel(QObject * parent = nullptr) |
構造函數,創建一個 QStringListModel 對象。 |
QStringListModel(const QStringList & strings, QObject * parent = nullptr) |
構造函數,創建一個包含指定字符串列表的 QStringListModel 對象。 |
QStringList stringList() const |
獲取當前模型中的字符串列表。 |
void setStringList(const QStringList & strings) |
設置模型中的字符串列表。 |
Qt::ItemFlags flags(const QModelIndex & index) const |
返回指定索引處的項目標志。 |
QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const |
返回指定行、列和父索引的模型索引。 |
QModelIndex parent(const QModelIndex & child) const |
返回指定子索引的父索引。 |
int rowCount(const QModelIndex & parent = QModelIndex()) const |
返回給定父索引下的行數。 |
int columnCount(const QModelIndex & parent = QModelIndex()) const |
返回給定父索引下的列數。 |
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const |
返回給定索引處的角色為 role 的數據。 |
bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole) |
設置給定索引處的角色為 role 的數據為 value。 |
bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()) |
在給定父索引下的 row 位置處插入 count 行。 |
bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()) |
從給定父索引下的 row 位置開始刪除 count 行。 |
這些方法使 QStringListModel 可以方便地管理和操作字符串列表數據,并能夠與 Qt 的視圖組件集成,實現數據的顯示和交互。
首先繪制UI界面,如下圖中所示,左側是一個ListView組件,右側是一個PlainTextEdit組件;

1.1 初始化模型
如下代碼演示了如何在 MainWindow 中使用 QStringListModel 和 QListView 來展示一個字符串列表。
以下是該代碼的一些說明:
- 在構造函數中,首先使用
QStringList theStringList創建了一個字符串列表,并向其中添加了一些城市名稱。 - 接著,創建了一個
QStringListModel對象model并使用setStringList方法將先前創建的字符串列表導入模型中。 - 然后,通過
ui->listView->setModel(model)將模型設置到QListView中,從而使模型中的數據在QListView中顯示。 - 使用
setEditTriggers方法設置了編輯觸發器,使得可以通過雙擊或選擇項目來觸發編輯操作。
這樣,通過 QStringListModel 和 QListView 的結合使用,可以很方便地在界面上展示和管理字符串列表的數據。
#include <iostream>
#include <QStringList>
#include <QStringListModel>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化一個StringList字符串列表
QStringList theStringList;
theStringList << "北京" << "上海" << "廣州" << "深圳" << "山東" << "四川";
// 創建并使用數據模型
model = new QStringListModel(this);
// 導入模型數據
model->setStringList(theStringList);
// 為listView設置模型
ui->listView->setModel(model);
ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked |
QAbstractItemView::SelectedClicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
運行后左側的ListView組將將被初始化為城市地址,如下圖所示;

1.2 添加與插入
如下代碼演示了如何在 MainWindow 中通過按鈕的點擊事件向 QStringListModel 中添加或插入數據。
以下是代碼的一些說明:
on_btnListAppend_clicked方法用于在QStringListModel的末尾添加一行。具體步驟包括:- 使用
insertRow在模型的末尾插入一行。 - 獲取最后一行的索引。
- 從界面的
lineEdit獲取輸入的文本。 - 使用
setData方法將文本設置到模型的指定索引處。 - 使用
setCurrentIndex方法將最后一行設置為當前選中行。 - 清空輸入框。
- 使用
on_btnListInsert_clicked方法用于在當前選中行的前面插入一行。具體步驟包括:- 獲取當前選中行的索引。
- 使用
insertRow在當前行的前面插入一行。 - 從界面的
lineEdit獲取輸入的文本。 - 使用
setData方法將文本設置到模型的指定索引處。 - 使用
setData方法設置對齊方式為右對齊。 - 使用
setCurrentIndex方法將當前行設置為當前選中行。
這樣,通過這兩個按鈕的點擊事件,可以向 QStringListModel 中添加或插入數據,并在 QListView 中進行顯示。
// 添加一行
void MainWindow::on_btnListAppend_clicked()
{
model->insertRow(model->rowCount()); // 在尾部插入一行
QModelIndex index = model->index(model->rowCount()-1,0); // 獲取最后一行的索引
QString LineText = ui->lineEdit->text();
model->setData(index,LineText,Qt::DisplayRole); // 設置顯示文字
ui->listView->setCurrentIndex(index); // 設置當前行選中
ui->lineEdit->clear();
}
// 插入一行數據到ListView
void MainWindow::on_btnListInsert_clicked()
{
QModelIndex index;
index= ui->listView->currentIndex(); // 獲取當前選中行
model->insertRow(index.row()); // 在當前行的前面插入一行
QString LineText = ui->lineEdit->text();
model->setData(index,LineText,Qt::DisplayRole); // 設置顯示文字
model->setData(index,Qt::AlignRight,Qt::TextAlignmentRole); // 設置對其方式
ui->listView->setCurrentIndex(index); // 設置當前選中行
}
運行后輸出如下圖,使用SetData則可以在index位置設置字符串,并最終setCurrentIndex設置到當前下標處;

1.3 轉換字符串
如下代碼演示了如何通過按鈕的點擊事件將 QStringListModel 的數據導入到 QPlainTextEdit 中。
以下是代碼的一些說明:
- 使用
stringList方法獲取數據模型的字符串列表。 - 清空
QPlainTextEdit,準備追加數據。 - 循環遍歷字符串列表,并將每個字符串追加到
QPlainTextEdit中,每個字符串之間用逗號隔開。
這樣,通過這個按鈕的點擊事件,可以將 QStringListModel 中的數據導入到 QPlainTextEdit 中。
// 顯示數據模型文本到QPlainTextEdit
void MainWindow::on_btnTextImport_clicked()
{
QStringList pList;
pList = model->stringList(); // 獲取數據模型的StringList
ui->plainTextEdit->clear(); // 先清空文本框
// 循環追加數據
for(int x=0;x< pList.count();x++)
{
ui->plainTextEdit->appendPlainText(pList.at(x) + QString(","));
}
}
當點擊顯示數據模型時,則會將列表轉換為字符串并按照特定格式輸出到編輯框內,如下圖所示;

附件下載
本博客所有文章除特別聲明外,均采用 BY-NC-SA 許可協議。轉載請注明出處!

浙公網安備 33010602011771號