中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

QStandardItem and QStandardItemModel Class Reference

發布時間:2020-07-25 03:51:49 來源:網絡 閱讀:697 作者:844133395 欄目:編程語言

        類QabstractItemModel,QabstractListModel,QAbstractTableModel不保存數據,用戶需要從這些類派生出子類,并在子類中定義某種數據結構來保存數據。與此不同,類QStandardItemModel負責保存數據,每個數據項被表示為類QStandardItem的對象。

        我們首先闡述如何使用類QStandardItem保存一個數據項,再闡述如何使用類QStandardItemModel將這些數據項組織起來,形成列表、表格或者樹,以供其他視圖類顯示。 

        如前文所述,一個數據項由若干個『角色,數據子項』對組成。類QStandardItem負責保存、訪問這些數據。該類的內部定義了一個類型為QVector的容器,每個容器元素本質上存放一個『角色,數據子項』對。 由于各個角色對應的數據子項可能具有不同的類型,Qt使用QVariant來存放每個數據子項。當用戶希望將一些數據存放在一個QStandardItem對象中時,可以調用其成員函數: 

    void setData ( const QVariant & value, int role) 

將『role, value』對存入。當用戶希望讀取該對象中的數據時,可以調用另外一個成員函數:

    QVariant data ( int role = ) const 

讀取角色role對應的數據子項。 以上兩個函數是QStandardItem的核心。有了這兩個函數,我們就可以訪問該類所表示數據項的任何一個『角色,數據子項』對。然而,對于一些常用角色,該類提供了更加簡潔、容易記憶的成員函數。例如,當一個數據項被顯示在視圖中時,它往往包含一些文字、一個圖標,還可能包含一個復選框。角色Qt::BackgroundRole控制顯示背景,Qt::FontRole控制文字字體,Qt::ForegroundRole控制文字顏色,Qt::CheckStateRole控制復選框的狀態。該類提供的一組成員函數可以方便地訪問這些常用角色對應的數據子項。成員函數setBackground()、background()分別設置/返回背景刷子。函數setFont()、font()分別設置/返回文字字體。函數setForeground()、foreground()分別設置/返回字體顏色。函數setCheckState()、checkState()分別設置/返回復選框狀態。 類QStandardItemModel將類QStandardItem表示的數據項組織起來,形成列表、表格、樹甚至更復雜的數據結構。該類提供了一組成員函數,向這些數據結構添加新的數據項,更改已經存在的數據項,或者刪除已有的數據項。另一方面,作為一個模型類,它實現了QAbstractItemModel定義的接口函數,以使其他視圖類能夠訪問模型中的數據項。 如果數據集被表示為一個列表,我們可以調用類QStandardItemModel的成員函數appendRow()向列表中添加一個數據項,使用item()讀取一個數據項,如代碼段13 10所示。

行①獲取模型最頂層的根節點,

行②創建一個QStandardItem對象,表示一個數據項,

行③將該數據項作為根節點的子節點添加到列表中。行②的構造函數在內部調用該類的setData()函數,將行②的QString對象作為Qt::DisplayRole對應的數據子項存入新構造的對象。由于數據集本身是一個列表,所以我們使用QListView顯示該數據集,讀者可以運行該例子查看顯示結果。 代碼段13 10,使用QStandardItemModel處理列表,取自z:\examples\mvc\QStandardItemModel_demo\main.cpp 

QStandardItemModel listModel; 
QStandardItem *rootItem = listModel.invisibleRootItem();//1     
for (int row = 0; row < 4; ++row) {  
    QStandardItem *item = new QStandardItem(QString("%0").arg(row) );//2
    rootItem->appendRow( item );//3
}  
QListView listView; 
listView.setModel ( & listModel );


如果數據集被表示為一個表格,可以調用類QStandardItemModel的成員函數setItem()設定表格中的某個數據項,如代碼段13 11所示。由于這個代碼段中的數據集是一個表格,所以使用QTableView顯示該數據集。 代碼段13 11,使用QStandardItemModel處理表格,取自z:\examples\mvc\QStandardItemModel_demo\main.cpp 

QStandardItemModel tableModel(4, 4); 
 for (int row = 0; row < 4; ++row) {   
     for (int column = 0; column < 4; ++column) {    
         QStandardItem *item = new QStandardItem(QString("%0,%1").arg(row).arg(column));
         tableModel.setItem(row, column, item);    
    }
 } 
QTableView tableView;
tableView.setModel( & tableModel );

        如果數據集被表示為一個樹,可以調用類QStandardItemModel的成員函數appendRow()向某個樹節點添加子節點。通過多次調用該函數,可以構建一棵復雜的樹。代碼段13 12構建一棵簡單的樹:最頂層的根節點有一個文字內容為“0”的子節點,該子節點有一個文字內容為“1”的子節點。依此類推,“1”子節點有一個“2”子節點,“2”子節點有一個“3”子節點,形成一棵深度為4的樹。這棵樹的每個節點都沒有兄弟節點(具有相同父節點的多個節點被相互稱為兄弟節點),感興趣的讀者可以修改這段代碼,以使其中某些節點具有兄弟節點。由于數據集是一棵樹,我們使用QTreeView顯示它。 代碼段13 12,使用QStandardItemModel處理樹,取自z:\examples\mvc\QStandardItemModel_demo\main.cpp 

QStandardItemModel treeModel; 
QStandardItem *parentItem = treeModel.invisibleRootItem(); 
for (int i = 0; i < 4; ++i) {  
        QStandardItem *item = new QStandardItem(QString("%0").arg(i));  
        parentItem->appendRow(item);  parentItem = item; 
} 
QTreeView treeView; 
treeView.setModel( & treeModel );

         類QStandardItemModel之所以能夠表示列表、表格、樹甚至更復雜的數據結構,得益于類QStandardItem在其內部定義了一個類型為QVector<QStandardItem*>的容器,可以將每個容器元素所指的QStandardItem對象設定為子對象。表現在如圖13 13所示的類圖上,類QStandardItem和自身具有“children”關系。一個類和自身發生關聯,在UML中被稱為自關聯(self association)。類QStandardItemModel定義了一個名為root的數據成員,邏輯上是一個指向QStandardItem對象的指針。這個對象可以設定多個QStandardItem的對象作為自己的子對象,而其中每個子對象又可以包含其他的子對象。依此類推,這棵樹可以具有任意深度,每個父對象可以包含任意多個子對象。   很自然地,QStandardItemModel可以使用QStandardItem表示具有樹狀數據結構的數據集,如圖13 14所示。圖中的每個小方框表示類QStandardItem的一個對象。如果小方框的邊線為虛,相應的QStandardItem對象并不表示數據集中的任何數據,僅被用來表示某種數據結構。如果小方框的邊線為實,相應的QStandardItem對象就表示數據集中的一個數據項。在右側的圖中,QStandardItemModel的數據成員root所指的對象表示一個不可見的根,而數據集的根(圖中結點G)被表示為這個不可見根的一個子節點。   列表被看作一個特殊的樹:不可見根具有若干個子節點,每個子節點表示列表中的一個數據項,不再包含任何子節點,如該圖左側所示。而表格的表示方式反而麻煩一些。不可見根含有若干子節點(圖中A,B,C),這些子節點并不表示數據集中的任何數據項。第i個子節點會包含若干子節點(比如圖中D,E,F),這些子節點才表示表格第i行的數據項。 

        使用QStandardItemModel表示數據集具有以下優點:該類使用QStandardItem存放數據項,用戶不必定義任何數據結構來存放數據項;QStandardItem使用自關聯關系,能夠表達列表、表格、樹甚至更復雜的數據結構,能夠涵蓋各種各樣的數據集;QStandardItem本身存放著多個『角色,數據子項』,視圖類、委托類或者其他用戶定義的類能夠方便地依據角色訪問各個數據子項。 然而,這種表示方法也有局限性:當數據集中的數據項很多時,施加在數據集上的某些操作的執行效率會很低。比如,設數據集是一個1萬行、20列的表格,其中第10列存放的是浮點數。如果我們想計算這一列的平均值,按照圖13 14,這需要遍歷所有行,取得第10列的QStandardItem對象,再依據角色“Qt::DisplayRole”取得對應的數據子項。由于這個數據子項的類型為QString,還需要將其轉換為浮點數,最后求所有浮點數的平均值。這些操作會耗費較長的時間。 因此,對于數據量不是很大、對性能要求不是很高的場合,我們可以使用類QStandardItemModel來表示一個數據集。否則,用戶應該從QAbstractItemModel、QAbstractListModel或者QAbstractTableModel派生新類,自行管理數據集的存放與訪問。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广河县| 那坡县| 崇州市| 孟村| 沾益县| 青铜峡市| 阿拉尔市| 习水县| 九江县| 长武县| 固始县| 崇礼县| 高要市| 麻栗坡县| 阜新| 时尚| 固安县| 松阳县| 临邑县| 峨眉山市| 昭通市| 依兰县| 塔河县| 海林市| 静海县| 精河县| 苍溪县| 广丰县| 灵台县| 孝昌县| 疏勒县| 定安县| 蒙自县| 定陶县| 钦州市| 临汾市| 志丹县| 临安市| 平塘县| 桃园县| 常熟市|