• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            清源游民 gameogre@gmail.com

            Model類

            基本概念
            在model/view構架中,model為view和delegates使用數據提供了標準接口。在Qt中,標準接口QAbstractItemModel類中被定義。不管數據在底層以何種數據結構存儲,QAabstractItemModel的子類會以層次結構的形式來表示數據,結構中包含了數據項表。我們按這種約定來訪問model中的數據項,但這個約定不會對如何顯示這些數據有任何限制。數據發(fā)生改變時,model通過信號槽機制來通知關聯的views。

            Model Indexes

            為了使數據存儲與數據訪問分開,引入了model index的概念。通過model index,可以引用model中的數據項,Views和delegates都使用indexes來訪問數據項,然后再顯示出來。因此,只有model需要了解如何獲取數據,被model管理的數據類型可以非常廣泛地被定義。Model indexes包含一個指向創(chuàng)建它們的model的指針,這會在配合多個model工作時避免混亂。
            QAbstractItemModel *model = index.model();

            model indexes提供了對一項數據信息的臨時引用,通過它可以訪問或是修改model中的數據。既然model有時會重新組織內部的數據結構,這時model indexes便會失效,因此不應該保存臨時的model indexes。假如需要一個對數據信息的長期的引用,那么應該創(chuàng)建一個persistent model index。這個引用會保持更新。臨時的model indexes由QModelIndex提供,而具有持久能力的model indexes則由QPersistentModelIndex提供。在獲取對應一個數據項的model index時,需要考慮有關于model的三個屬性:行數,列數,父項的model index。


            行與列
            在最基本的形式中,一個model可作為一個簡單的表來訪問,每個數據項由行,列數來定位。這必不意味著
            底層的數據用數組結構來存儲。行和列的使用僅僅是一種約定,它允許組件之間相互通訊??梢酝ㄟ^指定
            model中的行列數來獲取任一項數據,可以得到與數據項一一對應的那個index。
            QModelIndex index = model->index(row, column, ...);
            Model為簡單的,單級的數據結構如list與tables提供了接口,它們如上面代碼所顯示的那樣,不再需要別的信息被提供。當我們在獲取一個model index時,我們需要提供另外的信息。

            上圖代表一個基本的table model,它的每一項用一對行列數來定位。通過行列數,可以獲取代表一個數據項的model index .
            QModelIndex indexA = model->index(0, 0, QModelIndex());
             QModelIndex indexB = model->index(1, 1, QModelIndex());
             QModelIndex indexC = model->index(2, 1, QModelIndex());
            一個model的頂級項,由QModelIndex()取得,它們上式被用作父項。

            父項
            類似于表的接口在搭配使用table或list view時理想的,這種行列系統與view顯示的方式是確切匹配的。
            然則,像tree views這種結構需要model提供更為靈活的接口來訪問數據項。每個數據項可能是別的項的
            父項,上級的項可以獲取下級項的列表。
            當獲取model中數據項的index時,我們必須指定關于數據項的父項的信息。在model外部,引用一個數據
            項的唯一方法就是通過model index,因此需要在求取model index時指定父項的信息。
            QModelIndex index = model->index(row, column, parent);

            上圖中,A項和C項作為model中頂層的兄弟項:
             QModelIndex indexA = model->index(0, 0, QModelIndex());
             QModelIndex indexC = model->index(2, 1, QModelIndex());
            A有許多孩子,它的一個孩子B用以下代碼獲?。?br>QModelIndex indexB = model->index(1, 0, indexA);

            項角色
            model中的項可以作為各種角色來使用,這允許為不同的環(huán)境提供不同的數據。舉例來說,Qt::DisplayRole被用于訪問一個字符串,它作為文本會在view中顯示。典型地,每個數據項都可以為許多不同的角色提供數據,標準的角色在Qt::ItemDataRole中定義。我們可以通過指定model index與角色來獲取我們需要的數據:
            QVariant value = model->data(index, role);

            角色指出了從model中引用哪種類型的數據。views可以用不同的形式顯示角色,因此為每個角色提供正確
            的信息是非常重要的。通過為每個角色提供適當數據,model也為views和delegates提供了暗示,如何正確地
            把這些數據項顯給用戶。不同的views可以自由地解析或忽略這些數據信息,對于特殊的場合,也可以定義
            一些附加的角色。
            概念總結:
            1,Model indexes為views與delegages提供model中數據項定位的信息,它與底層的數據結構無關。
            2,通過指定行,列數,父項的model index來引用數據項。
            3,依照別的組件的要求,model indexes被model構建。
            4,使用index()時,如果指定了有效的父項的model index,那么返回得到的model index對應于父項的某個孩子。
            5,使用index()時,如果指定了無效的父項的model index,那么返回得到的model index對應于頂層項的某個孩子。
            6, 角色對一個數據項包含的不同類型的數據給出了區(qū)分。

            使用Model Indexes
            QDirModel *model = new QDirModel;
                 QModelIndex parentIndex = model->index(QDir::currentPath());
                 int numRows = model->rowCount(parentIndex);
             for (int row = 0; row < numRows; ++row)
             {
                     QModelIndex index = model->index(row, 0, parentIndex);
                     tring text = model->data(index, Qt::DisplayRole).toString();
                     // Display the text in a widget.

                 }
            以上的例子說明了從model中獲取數據的基本原則:
            1,model的尺寸可以從rowCount()與columnCount()中得出。這些函數通常都需要一個表示父項的model index。
            2,model indexes用來從model中訪問數據項,數據項用行,列,父項model index定位。
            3, 為了訪問model頂層項,可以使用QModelIndex()指定。
            4, 數據項為不同的角色提供不同的數據。為了獲取數據,除了model index之外,還要指定角色。

            posted on 2007-06-17 14:31 清源游民 閱讀(7507) 評論(0)  編輯 收藏 引用 所屬分類: Qt
            <2007年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            留言簿(35)

            隨筆分類(78)

            隨筆檔案(74)

            文章檔案(5)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久九色综合九色99伊人| 久久影院久久香蕉国产线看观看| 亚洲精品无码久久久久sm| 国产美女亚洲精品久久久综合| 欧美精品久久久久久久自慰| 久久99中文字幕久久| 亚洲中文字幕伊人久久无码| 亚洲AV无一区二区三区久久| 久久久WWW成人免费精品| 狠狠精品久久久无码中文字幕| 久久精品男人影院| 亚洲国产精品无码久久久蜜芽| 99热成人精品免费久久| 无码国内精品久久人妻| 国产综合成人久久大片91| 久久夜色精品国产噜噜麻豆| 婷婷久久综合九色综合绿巨人| 久久久噜噜噜www成人网| 2021久久精品免费观看| 国产精品久久久久久久久久免费| 欧洲精品久久久av无码电影| 无码国内精品久久综合88| 久久久久国产精品三级网| 国产一久久香蕉国产线看观看| 免费精品久久天干天干| 色播久久人人爽人人爽人人片aV| 亚洲国产成人久久精品影视| avtt天堂网久久精品| 久久丫精品国产亚洲av不卡| 亚洲精品无码专区久久久| 亚洲精品WWW久久久久久| 久久亚洲高清综合| 中文字幕无码av激情不卡久久| 人人狠狠综合久久亚洲高清| 久久久噜噜噜久久中文字幕色伊伊| 久久综合九色综合欧美狠狠| 久久久久久久99精品免费观看| 久久亚洲国产精品一区二区| 青青热久久综合网伊人| 亚洲一区中文字幕久久| 久久99久久成人免费播放|