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操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所...