QTreeView使用总结11,数据过滤,使用代理model,简单过滤
1,簡(jiǎn)介
有時(shí)候需要對(duì)tree內(nèi)的數(shù)據(jù)按一些條件進(jìn)行過(guò)濾顯示,比如按搜索條件過(guò)濾,這時(shí)候就用到了代理model。
通常使用Qt提供的 QSortFilterProxyModel 類(lèi),該類(lèi)實(shí)現(xiàn)了常見(jiàn)的按行列過(guò)濾的方法。
也可以自己從基類(lèi)繼承,重寫(xiě) filterAcceptsRow 和 filterAcceptsColumn 來(lái)實(shí)現(xiàn)過(guò)濾:
重寫(xiě) lessThan 方法可實(shí)現(xiàn)排序:
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;本文先介紹直接使用QSortFilterProxyModel 類(lèi)接口完成常見(jiàn)過(guò)濾功能的方法,后面介紹繼承該類(lèi)自定義過(guò)濾規(guī)則的方法。
2,參考資料
官方示例:在QtCreator的歡迎里搜“QSortFilterProxyModel”,出現(xiàn)2個(gè)示例。
Basic Sort/Filter Model Example 基礎(chǔ)排序/過(guò)濾模型示例
Custom Sort/Filter Model Example 自定義排序/過(guò)濾模型示例
3,效果
4,實(shí)現(xiàn)
相比之前正常構(gòu)造QTreeView的model的過(guò)程,這里需要新建一個(gè)QSortFilterProxyModel對(duì)象,并且設(shè)其源model為我們之前原始的model。然后把tree的model設(shè)為該QSortFilterProxyModel。
這樣tree在顯示時(shí)先訪(fǎng)問(wèn)該QSortFilterProxyModel,通過(guò)其提供的過(guò)濾規(guī)則最后從真實(shí)的model里面取數(shù)據(jù)進(jìn)行顯示,實(shí)現(xiàn)數(shù)據(jù)過(guò)濾。
主要代碼如下:
void MainWindow::InitTree() {//1,QTreeView常用設(shè)置項(xiàng)QTreeView* t = ui->treeView; // t->setEditTriggers(QTreeView::NoEditTriggers); //單元格不能編輯t->setSelectionBehavior(QTreeView::SelectRows); //一次選中整行t->setSelectionMode(QTreeView::SingleSelection); //單選,配合上面的整行就是一次選單行 // t->setAlternatingRowColors(true); //每間隔一行顏色不一樣,當(dāng)有qss時(shí)該屬性無(wú)效t->setFocusPolicy(Qt::NoFocus); //去掉鼠標(biāo)移到單元格上時(shí)的虛線(xiàn)框//2,列頭相關(guān)設(shè)置t->header()->setHighlightSections(true); //列頭點(diǎn)擊時(shí)字體變粗,去掉該效果t->header()->setDefaultAlignment(Qt::AlignCenter); //列頭文字默認(rèn)居中對(duì)齊t->header()->setDefaultSectionSize(100); //默認(rèn)列寬100t->header()->setStretchLastSection(true); //最后一列自適應(yīng)寬度t->header()->setSortIndicator(0,Qt::AscendingOrder); //按第1列升序排序//3,構(gòu)造Model//設(shè)置列頭QStringList headers;headers << QStringLiteral("年級(jí)/班級(jí)")<< QStringLiteral("姓名")<< QStringLiteral("分?jǐn)?shù)")<< QStringLiteral("評(píng)價(jià)");mModel = new QStandardItemModel(ui->treeView);mModel->setHorizontalHeaderLabels(headers);//設(shè)置數(shù)據(jù)QStringList names;names<<"aaa"<<"bbb"<<"ccc"<<"ddd"<<"eee"<<"abc"<<"abcdef";for(int i=0; i<names.size(); i++){//二級(jí)節(jié)點(diǎn):班級(jí)、姓名、分?jǐn)?shù)QList<QStandardItem*> items;QStandardItem* itemClass = new QStandardItem(QStringLiteral("%1班").arg(i+1));QStandardItem* itemName = new QStandardItem(names.at(i));QStandardItem* itemScore = new QStandardItem("100");QStandardItem* itemAssess = new QStandardItem("優(yōu)");items << itemClass << itemName << itemScore << itemAssess;mModel->appendRow(items); //二級(jí)節(jié)點(diǎn)掛在一級(jí)的第1列節(jié)點(diǎn)上}//4,構(gòu)造代理model,設(shè)置過(guò)濾列為第2列mProxyModel = new QSortFilterProxyModel;mProxyModel->setSourceModel(mModel);mProxyModel->setFilterKeyColumn(1);t->setModel(mProxyModel); }三個(gè)按鈕設(shè)置三種不同的過(guò)濾形式:
根據(jù)正則表達(dá)式、通配符、普通文本
5,源碼
鏈接:https://pan.baidu.com/s/1FgOHolNkzrKi1eRzvlpntw
提取碼:qqpu
網(wǎng)盤(pán)若失效,可在群文件下載:
群號(hào)碼:1149411109 (若滿(mǎn)加2群:917341904)
群名稱(chēng):Qt實(shí)戰(zhàn)派學(xué)習(xí)群
總結(jié)
以上是生活随笔為你收集整理的QTreeView使用总结11,数据过滤,使用代理model,简单过滤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用jQuery如何获取复选框的值
- 下一篇: CSS鼠标悬停div加边框效果