QTreeView使用总结11,数据过滤,使用代理model,简单过滤
1,簡介
有時(shí)候需要對tree內(nèi)的數(shù)據(jù)按一些條件進(jìn)行過濾顯示,比如按搜索條件過濾,這時(shí)候就用到了代理model。
通常使用Qt提供的 QSortFilterProxyModel 類,該類實(shí)現(xiàn)了常見的按行列過濾的方法。
也可以自己從基類繼承,重寫 filterAcceptsRow 和 filterAcceptsColumn 來實(shí)現(xiàn)過濾:
重寫 lessThan 方法可實(shí)現(xiàn)排序:
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;本文先介紹直接使用QSortFilterProxyModel 類接口完成常見過濾功能的方法,后面介紹繼承該類自定義過濾規(guī)則的方法。
2,參考資料
官方示例:在QtCreator的歡迎里搜“QSortFilterProxyModel”,出現(xiàn)2個(gè)示例。
Basic Sort/Filter Model Example 基礎(chǔ)排序/過濾模型示例
Custom Sort/Filter Model Example 自定義排序/過濾模型示例
3,效果
4,實(shí)現(xiàn)
相比之前正常構(gòu)造QTreeView的model的過程,這里需要新建一個(gè)QSortFilterProxyModel對象,并且設(shè)其源model為我們之前原始的model。然后把tree的model設(shè)為該QSortFilterProxyModel。
這樣tree在顯示時(shí)先訪問該QSortFilterProxyModel,通過其提供的過濾規(guī)則最后從真實(shí)的model里面取數(shù)據(jù)進(jìn)行顯示,實(shí)現(xiàn)數(shù)據(jù)過濾。
主要代碼如下:
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í)該屬性無效t->setFocusPolicy(Qt::NoFocus); //去掉鼠標(biāo)移到單元格上時(shí)的虛線框//2,列頭相關(guān)設(shè)置t->header()->setHighlightSections(true); //列頭點(diǎn)擊時(shí)字體變粗,去掉該效果t->header()->setDefaultAlignment(Qt::AlignCenter); //列頭文字默認(rèn)居中對齊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("年級/班級")<< QStringLiteral("姓名")<< QStringLiteral("分?jǐn)?shù)")<< QStringLiteral("評價(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++){//二級節(jié)點(diǎn):班級、姓名、分?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); //二級節(jié)點(diǎn)掛在一級的第1列節(jié)點(diǎn)上}//4,構(gòu)造代理model,設(shè)置過濾列為第2列mProxyModel = new QSortFilterProxyModel;mProxyModel->setSourceModel(mModel);mProxyModel->setFilterKeyColumn(1);t->setModel(mProxyModel); }三個(gè)按鈕設(shè)置三種不同的過濾形式:
根據(jù)正則表達(dá)式、通配符、普通文本
5,源碼
鏈接:https://pan.baidu.com/s/1FgOHolNkzrKi1eRzvlpntw
提取碼:qqpu
網(wǎng)盤若失效,可在群文件下載:
群號碼:1149411109 (若滿加2群:917341904)
群名稱:Qt實(shí)戰(zhàn)派學(xué)習(xí)群
總結(jié)
以上是生活随笔為你收集整理的QTreeView使用总结11,数据过滤,使用代理model,简单过滤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用jQuery如何获取复选框的值
- 下一篇: c/c++宏函数和多参宏函数