• <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構(gòu)架中,model為view和delegates使用數(shù)據(jù)提供了標(biāo)準(zhǔn)接口。在Qt中,標(biāo)準(zhǔn)接口QAbstractItemModel類中被定義。不管數(shù)據(jù)在底層以何種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),QAabstractItemModel的子類會(huì)以層次結(jié)構(gòu)的形式來表示數(shù)據(jù),結(jié)構(gòu)中包含了數(shù)據(jù)項(xiàng)表。我們按這種約定來訪問model中的數(shù)據(jù)項(xiàng),但這個(gè)約定不會(huì)對(duì)如何顯示這些數(shù)據(jù)有任何限制。數(shù)據(jù)發(fā)生改變時(shí),model通過信號(hào)槽機(jī)制來通知關(guān)聯(lián)的views。

            Model Indexes

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

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


            行與列
            在最基本的形式中,一個(gè)model可作為一個(gè)簡(jiǎn)單的表來訪問,每個(gè)數(shù)據(jù)項(xiàng)由行,列數(shù)來定位。這必不意味著
            底層的數(shù)據(jù)用數(shù)組結(jié)構(gòu)來存儲(chǔ)。行和列的使用僅僅是一種約定,它允許組件之間相互通訊。可以通過指定
            model中的行列數(shù)來獲取任一項(xiàng)數(shù)據(jù),可以得到與數(shù)據(jù)項(xiàng)一一對(duì)應(yīng)的那個(gè)index。
            QModelIndex index = model->index(row, column, ...);
            Model為簡(jiǎn)單的,單級(jí)的數(shù)據(jù)結(jié)構(gòu)如list與tables提供了接口,它們?nèi)缟厦娲a所顯示的那樣,不再需要?jiǎng)e的信息被提供。當(dāng)我們?cè)讷@取一個(gè)model index時(shí),我們需要提供另外的信息。

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

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

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

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

            角色指出了從model中引用哪種類型的數(shù)據(jù)。views可以用不同的形式顯示角色,因此為每個(gè)角色提供正確
            的信息是非常重要的。通過為每個(gè)角色提供適當(dāng)數(shù)據(jù),model也為views和delegates提供了暗示,如何正確地
            把這些數(shù)據(jù)項(xiàng)顯給用戶。不同的views可以自由地解析或忽略這些數(shù)據(jù)信息,對(duì)于特殊的場(chǎng)合,也可以定義
            一些附加的角色。
            概念總結(jié):
            1,Model indexes為views與delegages提供model中數(shù)據(jù)項(xiàng)定位的信息,它與底層的數(shù)據(jù)結(jié)構(gòu)無關(guān)。
            2,通過指定行,列數(shù),父項(xiàng)的model index來引用數(shù)據(jù)項(xiàng)。
            3,依照別的組件的要求,model indexes被model構(gòu)建。
            4,使用index()時(shí),如果指定了有效的父項(xiàng)的model index,那么返回得到的model index對(duì)應(yīng)于父項(xiàng)的某個(gè)孩子。
            5,使用index()時(shí),如果指定了無效的父項(xiàng)的model index,那么返回得到的model index對(duì)應(yīng)于頂層項(xiàng)的某個(gè)孩子。
            6, 角色對(duì)一個(gè)數(shù)據(jù)項(xiàng)包含的不同類型的數(shù)據(jù)給出了區(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中獲取數(shù)據(jù)的基本原則:
            1,model的尺寸可以從rowCount()與columnCount()中得出。這些函數(shù)通常都需要一個(gè)表示父項(xiàng)的model index。
            2,model indexes用來從model中訪問數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng)用行,列,父項(xiàng)model index定位。
            3, 為了訪問model頂層項(xiàng),可以使用QModelIndex()指定。
            4, 數(shù)據(jù)項(xiàng)為不同的角色提供不同的數(shù)據(jù)。為了獲取數(shù)據(jù),除了model index之外,還要指定角色。

            posted on 2007-06-17 14:31 清源游民 閱讀(7507) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Qt
            <2009年5月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            留言簿(35)

            隨筆分類(78)

            隨筆檔案(74)

            文章檔案(5)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品久久久久久久久久中文字幕 | 久久99精品久久久久久| 久久久久一级精品亚洲国产成人综合AV区 | 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久午夜电影网| 久久精品一区二区| 久久96国产精品久久久| 国产欧美一区二区久久| 久久福利青草精品资源站免费| 久久午夜无码鲁丝片| 熟妇人妻久久中文字幕| 欧洲成人午夜精品无码区久久 | 老司机国内精品久久久久| 久久99精品国产一区二区三区| 久久99精品国产99久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 成人免费网站久久久| 久久99热国产这有精品| 久久这里只有精品久久| 国产激情久久久久影院小草| 精品久久久久久久中文字幕| 久久婷婷五月综合成人D啪| 色婷婷久久久SWAG精品| 久久久www免费人成精品| 久久天天躁狠狠躁夜夜96流白浆| 久久精品中文闷骚内射| 精品久久久久久| 久久国产免费直播| 亚洲va久久久久| 久久亚洲AV成人无码国产| 99久久免费国产精品| 伊人久久亚洲综合影院| 久久夜色精品国产噜噜亚洲AV| 久久免费精品视频| 综合久久一区二区三区 | 国产精品99久久精品| 理论片午午伦夜理片久久| 久久棈精品久久久久久噜噜| 久久精品成人免费观看97| 欧洲成人午夜精品无码区久久| 狠狠精品干练久久久无码中文字幕 |