Qt QStringListModel用法詳解

2021-10-13 05:38:25 字數 3766 閱讀 4499

qstringlistmodel 用於處理字串列表的資料模型,它可以作為 qlistview 的資料模型,在介面上顯示和編輯字串列表。

qstringlistmodel 的 setstringlist() 函式可以初始化資料模型的字串列表的內容,stringlist() 函式返回資料模型內的字串列表,在關聯的 listview 元件裡編輯修改資料後,資料都會及時更新到資料模型內的字串列表裡。

qstringlistmodel 提供編輯和修改字串列表資料的函式,如 insertrows()、removerows()、setdata() 等,這些操作直接影響資料模型內部的字串列表,並且修改後的資料會自動在關聯的 listview 元件裡重新整理顯示。

例項 samp5_2 採用 qstringlistmodel 作為資料模型,qlistview 元件作為檢視元件,演示了 qstringlistmodel 和 qlistview 構成 model/view 結構編輯字串列表的功能,程式執行時介面如圖 1 所示。

圖 1 例項 samp5_2 的執行時介面

視窗左側是對 qstringlistmodel 的一些操作,右側的 qplaintextedit 元件顯示 qstring listmodel::stringlist() 的內容,以檢視其是否與介面上 listview 元件顯示的內容一致。

model/view 結構物件和元件初始化

例項 samp5_2 的視窗是從 qwidget 繼承而來的類 widget,介面採用視覺化設計。在 widget 類中定義乙個 qstringlistmodel 類的變數:

qstringlistmodel *themodel;

在 widget 類的建構函式中進行變數的建立,完成資料模型與介面檢視元件的關聯,下面是 widget 類建構函式的**:

widget::widget(qwidget *parent) :

qwidget(parent),

ui(new ui::widget)

qstringlistmodel 的 setstringlist() 函式將乙個字串列表的內容作為資料模型的初始資料內容。qlistview的setmodel() 函式為介面檢視元件設定乙個資料模型。

程式執行後,介面上 listview 元件裡就會顯示初始化的字串列表的內容。

編輯、新增、刪除項的操作

1) 編輯項

qlistview::setedittriggers() 函式設定 qlistview 的條目是否可以編輯,以及如何進入編輯狀態,函式的引數是 qabstractitemview::edittrigger 列舉型別值的組合。建構函式中設定為:

ui->listview->setedittriggers(qabstractitemview::doubleclicked |qabstractitemview::selectedclicked);

ui->listview->setedittriggers(qabstractitemview:: noedittriggers);

2) 新增項

新增項是要在列表的最後新增一行,介面上「新增項」按鈕的槽函式**如下:

對資料的操作都是針對資料模型的,所以,插入一行使用的是 qstringlistmodel 的 insertrow (int row) 函式,其中 row 是乙個行號,表示在 row 行之前插入一行。要在列表的最後插入一行,引數 row 設定為列表當前的行數即可。

這樣只是在列表尾部新增乙個空行,沒有任何文字。為了給新增的項設定乙個預設的文字標題,首先要獲得新增項的模型索引,即:

qmodelindex index=themodel->index (themodel->rowcount () -1, 0);

qstringlistmodel 的 index() 函式根據傳遞的行號、列號、父項的模型索引生成乙個模型索引,這行**為新增的最後乙個項生成乙個模型索引 index。

為新增的項設定乙個文字標題「new item」,使用 setdata() 函式,並用到前面生成的模型索引 index。**如下:

themodel->setdata(index, "new item",qt::displayrole);

在使用 setdata() 函式時,必須指定設定資料的角色,這裡的角色是 qt::displayrole,它是用於顯示的角色,即項的文字標題。

3) 插入項

「插入項」按鈕的功能是在列表的當前行前面插入一行,其實現**如下:

void widget::on_btnlistinsert_clicked()

qlistview::currentindex() 獲得當前項的模型索引 index,index.row() 則返回這個模型索引的行號。

4) 刪除當前項

使用 qstringlistmodel 的 removerow() 函式刪除某一行的**如下:

void widget::on_btnlistdelete_clicked()

5) 刪除列表

刪除列表的所有項可使用 qstringlistmodel 的 removerows(int row, int count) 函式,它表示從行號 row 開始刪除 count 行。**如下:

void widget::on_btnlistclear_clicked()

以文字顯示資料模型的內容

以上在對介面上 listview 的項進行編輯時,實際操作的都是其關聯的資料模型 themodel,在對資料模型進行插入、新增、刪除項操作後,內容立即在 listview 上顯示出來,這是資料模型與檢視元件之間訊號與槽的作用,當資料模型的內容發生改變時,通知檢視元件更新顯示。

同樣的,當在 listview 上雙擊一行進入編輯狀態,修改乙個項的文字內容後,這部分內容也儲存到資料模型裡了。那麼,資料模型內部應該儲存有最新的資料內容,對於 qstringlistmodel 模型來說,通過 stringlist() 函式可以得到其最新的資料副本。介面上的「顯示資料模型的 stringlist」按鈕獲取資料模型的 stringlist,並用多行文字的形式顯示其內容,以檢驗對資料模型修改資料,特別是在介面上修改列表項的文字後,其內部的資料是否同步更新了。

以下是介面上的「顯示資料模型的 stringlist」按鈕的 clicked() 訊號的槽函式**,它通過資料模型的 stringlist() 函式獲取字串列表,並在 plaintextedit 裡逐行顯示:

void widget::on_btntextimport_clicked()

程式執行時,無論對 listview 的列表做了什麼編輯和修改,單擊「顯示資料模型的 stringlist」按鈕,在文字框裡顯示的文字內容與 listview 裡總是完全相同的,說明資料模型的資料與介面上顯示的內容是同步的。

其他功能

qlistview 的 clicked() 訊號會傳遞乙個 qmodellndex 型別的引數,利用該引數,可以顯示當前項的模型索引的行和列的資訊,實現**如下:

void widget::on_listview_clicked(const qmodelindex &index)

在這個例項中,通過 qstringlistmodel 和 qlistview 說明了資料模型與檢視元件之間構成 model/view 結構的基本原理。

前面章節中,我們採用 qlistwidget 設計過乙個列表編輯器(samp4_7),對比這兩個例項,可以發現如下兩點:

所以,這是 model/view 結構與便利元件之間的主要區別。

nginx limit req zone用法詳解

nginx可以使用ngx http limit req module模組的limit req zone指令進行限流訪問,防止使用者惡意攻擊刷爆伺服器。ngx http limit req module模組是nginx預設安裝的,所以直接配置即可。首先,在nginx.conf檔案中的http模組下配置...

優先佇列priority queue 用法詳解

優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序 每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所以我們無論按照什麼順序push一堆數,最終在佇列...

優先佇列priority queue 用法詳解

優先佇列priority queue 用法詳解 優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序 每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所...