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

溫馨提示×

溫馨提示×

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

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

QT Model View Controller 使用和認識

發布時間:2020-06-26 17:30:26 來源:網絡 閱讀:541 作者:WZM3558862 欄目:開發技術

MVC全稱是 Model View Controller,是一種非常非常流行的架構模式,相關MVC具體的,網上已經非常非常詳盡了,不贅述了。

關于Qt中的MVC

其實Qt中的MVC并不叫MVC,而是叫“MVD”,Qt中沒有Controller的說法,而是使用了另外一種抽象: Delegate (委托) ,其行為和傳統的MVC是相同的。寫過C#的同學肯定對delegate就不陌生了,這里delegate的用法就是負責協調Model和View之間的數據。其思想如下圖所示:

QT  Model View Controller 使用和認識

Model是唯一和數據集打交道的組件,View不接觸數據源,其所需要的數據可以從Model中取出,而Delegate正式負責協調Model和View上數據。這種將view和數據源隔離的方式有幾點好處:

1、在處理較大的數據集時每個組件各司其職,不至于降低性能。

2、一個Model可以映射到多個View,這樣可以以不同的方式查看數據同一份數據。

3、如果底層數據源的存儲改變了,我們只需要處理Model就可以了。

舉個具體的例子:

QT  Model View Controller 使用和認識

假設如圖所示的Data代表一個學校的期末成績的數據源,Model獲取了其中計算機學院的所有學生的成績,而軟件的界面上我們有多個View用于顯示不同專業學生成績的詳細,我們只需要從Model中篩選出所需的數據,而篩選的工作正是交給Delegate來做的。

使用Qt預定義組件

Qt為我們預定義了豐富組件類,通常情況下使用這些類就能實現比較好看的視圖了。這個例子里我們正式使用QTableView和QStandardItemModel,Delegate在這里不需要關注,默認的Delegate就可以很好的協調Model和View了。 考慮篇幅,我做一個比較小的視圖,就不考慮外部的數據源了,數據都是我手動添加的 ,在一個Widget類中我們分別定義一個QTableView和一個QStandardItemModel,其結構大致是這樣的:

class demo : public QWidget
{  Q_OBJECT

public:  demo(QWidget *parent = 0);  ~demo();

private:  Ui::demoClass ui;  QStandardItemModel* mModel;
};

ui成員是Qt Designer生成的類,我們的QTableView的對象就在其中(QTableView我直接拖拽上去的,為了節約時間,呵呵),之后再demo的構造函數中我們使用setModel函數就可以把Model和view進行綁定:

demo::demo(QWidget *parent)
: QWidget(parent), mModel(new QStandardItemModel())
{  ui.setupUi(this);  mModel->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("Name")));  mModel->setHorizontalHeaderItem(1, new QStandardItem(QObject::tr("Type")));  mModel->setHorizontalHeaderItem(2, new QStandardItem(QObject::tr("Size")));  mModel->setHorizontalHeaderItem(3, new QStandardItem(QObject::tr("Time")));    QList<QStandardItem *> item;  item.append(new QStandardItem(QObject::tr("Qt.css")));  item.append(new QStandardItem(QObject::tr("css")));  item.append(new QStandardItem(QObject::tr("100KB")));  item.append(new QStandardItem(QObject::tr("2016-1-10")));  mModel->appendRow(item);
    ......  ui.mView->setModel(mModel);
}

一些重復的添加數據的工作,我就沒有貼出來,這段代碼基本上沒有接觸過Qt的人也能很好的理解,很直觀是吧。首先在mModel中設置后表頭然后添加數據,到最后調用setModel()函數綁定M/V,之后Delegate就默默地后臺工作,幫我們完成View的繪制,其效果圖:

QT  Model View Controller 使用和認識

當然界面我用qss做了一些美化的工作,感興趣的朋友可以點擊 這里 下載到這個demo的源碼。

上面例子的不足之處

也許上述的例子已經能滿足你的日常需要,但是仍有瑕疵,一個“炫酷”的界面應該具備以下幾點 比如1、Name列 要能顯示文件類型的ICON ,2 、日期編輯的時候不是允許輸入任意字符,當然你可以使用正則表達式過濾輸入,但是這仍然不夠完美,合理的方法應該是使用一個日歷的組件去編輯Time列。

  • 2


向AI問一下細節

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

AI

谢通门县| 太仓市| 平山县| 建始县| 柞水县| 泽普县| 黔东| 老河口市| 兴城市| 凤庆县| 西乌珠穆沁旗| 阿拉善盟| 崇阳县| 长白| 灵寿县| 德州市| 勐海县| 新源县| 武冈市| 普宁市| 灵川县| 丹江口市| 上饶市| 怀宁县| 屯留县| 安国市| 富平县| 婺源县| 新绛县| 静宁县| 龙门县| 兖州市| 卢氏县| 博客| 信宜市| 盐城市| 通渭县| 林口县| 疏勒县| 正镶白旗| 石首市|