日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QTreeView使用总结11,数据过滤,使用代理model,简单过滤

發(fā)布時(shí)間:2023/12/31 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QTreeView使用总结11,数据过滤,使用代理model,简单过滤 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1,簡介

有時(shí)候需要對tree內(nèi)的數(shù)據(jù)按一些條件進(jìn)行過濾顯示,比如按搜索條件過濾,這時(shí)候就用到了代理model。
通常使用Qt提供的 QSortFilterProxyModel 類,該類實(shí)現(xiàn)了常見的按行列過濾的方法。
也可以自己從基類繼承,重寫 filterAcceptsRow 和 filterAcceptsColumn 來實(shí)現(xiàn)過濾:

virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const;

重寫 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á)式、通配符、普通文本

void MainWindow::on_btn1_clicked() {//正則表達(dá)式//包含a、b、c中任意一個(gè)字符就滿足QRegExp regExp("[abc]", Qt::CaseInsensitive, QRegExp::RegExp);mProxyModel->setFilterRegExp(regExp); }void MainWindow::on_btn2_clicked() {//通配符//有bc的滿足QRegExp regExp("bc*", Qt::CaseInsensitive, QRegExp::Wildcard);mProxyModel->setFilterRegExp(regExp); }void MainWindow::on_btn3_clicked() {//文本//包含文本e的滿足QRegExp regExp("e", Qt::CaseInsensitive, QRegExp::FixedString);mProxyModel->setFilterRegExp(regExp); }

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。