最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt利用QSortFilterProxyModel代理實(shí)現(xiàn)自定義排序與聯(lián)合過濾

 更新時(shí)間:2022年11月29日 09:34:09   作者:音視頻開發(fā)老舅  
QsortFilterProxyModel類用來為model和view之間提供強(qiáng)大的排序和過濾支持。這篇文章將利用QSortFilterProxyModel代理實(shí)現(xiàn)自定義排序與聯(lián)合過濾,需要的可以參考一下

1. QsortFilterProxyModel介紹

QsortFilterProxyModel類用來為model和view之間提供強(qiáng)大的排序和過濾支持。將模型排序或者過濾后在視圖上顯示,并且無需對模型中的數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換,也無需對模型在中數(shù)據(jù)進(jìn)行修改。

比如: 對某列篩選帶有”xxx”的關(guān)鍵字出來.并支持多則表達(dá)式

使用代理的項(xiàng)視圖模型代碼如下:

QTreeView *treeView = new QTreeView;  
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel); //將model放入代理中 
treeView->setModel(proxyModel); //在視圖中安裝代理

2.QSortFilterProxyModel自定義排序

自定義排序需要子類化QsortFilterProxyModel,然后重寫lessThan().

注意 : 如果重寫了lessThan(),那么就不會再調(diào)用model的sort方法了.

lessThan()使用示例:

bool SortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
    //通過當(dāng)前視圖中的index位置獲取model中實(shí)際的數(shù)據(jù)
    QVariant leftData = sourceModel()->data(source_left);
    QVariant rightData = sourceModel()->data(source_right);
    switch ( source_left.column() )
    {
        case 0 :     //序號,需要判斷數(shù)字
        case 3 :     //信號ID,需要判斷數(shù)字
            return leftData.toInt() < rightData.toInt();
            break;
        default :    //其它,只判斷字符串
            return leftData.toString() < rightData.toString();
            break;
    }
 
    return true;     
 
}

除了排序外,QSortFilterProxyModel還可以用來隱藏與某個(gè)過濾器不匹配的項(xiàng)。使用QRegExp對象指定篩選器,并將篩選器應(yīng)用于給定列的每個(gè)項(xiàng)的filterRole() (默認(rèn)情況下為Qt::DisplayRole)。QRegExp對象可用于匹配正則表達(dá)式、通配符模式或固定字符串。

3.過濾方法1-使用setFilterKeyColumn()過濾列

首先需要通過void QsortFilterProxyModel::setFilterRegExp(const QRegExp &regExp)來設(shè)置FilterProxyModel的過濾器.

然后通過QsortFilterProxyModel::setFilterKeyColumn(int)來過濾某一列.

如果要更改大小寫匹配,可以通過QsortFilterProxyModel::sortCaseSensitivity()來設(shè)置.

示例代碼如下所示:

QTableView *view = new QTableView;   
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel); //將model放入代理中   
view->setModel(proxyModel);             //在視圖中安裝代理
 
QRegExp regExp("^(-?\\d+)(\\.\\d+)?$", Qt::CaseSensitive, QRegExp::RegExp);
//通過^(-?\d+)(\.\d+)?$來匹配整數(shù)
proxyModel->setFilterRegExp(regExp);   //安裝過濾器
 
proxyModel->setFilterKeyColumn(0);    
proxyModel->setFilterKeyColumn(2);    //將第一列和第三列同時(shí)是整數(shù)的數(shù)據(jù)顯示出來.

每當(dāng)過濾格式改變,則setFilterRegExp()重新更新過濾器即可.

弊端:

但是這樣只能"與方式"顯示model,要第一列和第三列公共是整數(shù)的才能顯示出來,不能實(shí)現(xiàn)"或方式"顯示.

所以,如果要使用聯(lián)合多列過濾,建議使用過濾方法2來實(shí)現(xiàn).

4.過濾方法2-重寫filterAcceptsRow成員函數(shù)

以實(shí)現(xiàn)"只要第一列有整數(shù)或者第三列有整數(shù)的都顯示出來"為例,首先需要子類化QsortFilterProxyModel類,然后重寫filterAcceptsRow()或者filterAcceptsColumn()函數(shù).

由于我們篩選第一列和第三列,列號是明確的,而行號是未知的, 所以我們只重寫filterAcceptsRow()函數(shù).

示例代碼如下所示:

bool SortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    //獲取model中實(shí)際的數(shù)據(jù)
    QString dataColumn1 =  sourceModel()->index(source_row, 0, source_parent).data(Qt::DisplayRole).toString();
    QString dataColumn3 =  sourceModel()->index(source_row, 2, source_parent).data(Qt::DisplayRole).toString();
    if(dataColumn1.contains(this->filterRegExp()))     
    {
        return true;
    }
    else if(dataColumn3.contains(this->filterRegExp())) 
    {
        return true;
    }
    return false;        
 
}

然后創(chuàng)建SortFilterProxyModel類時(shí),只需要安裝過濾器即可:

SortFilterProxyModel *proxyModel = new SortFilterProxyModel();
proxyModel->setSourceModel(sourceModel);            //將model放入代理中   
treeView->setModel(proxyModel);                     //在視圖中安裝代理
proxyModel->setFilterRegExp("^(-?\\d+)(\\.\\d+)?$"); //安裝過濾器

每當(dāng)過濾格式改變,則setFilterRegExp()重新更新過濾器即可.

注意事項(xiàng):

如果過濾方式改變了,比如從過濾第1列變成了過濾第2列,需要調(diào)用invalidateFilter()函數(shù),使之前的過濾失效,激活當(dāng)前過濾.

5.代碼示例

model采用上章代碼的CustomModel為例.支持篩選多列、篩選模式支持:或方式、與方式、

界面實(shí)現(xiàn)如下所示:

#ifndef SORTFILTERPROXYMODEL_H
#define SORTFILTERPROXYMODEL_H
 
#include <QObject>
#include <QSortFilterProxyModel>
#include <QList>
 
class SortFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
 
    virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
    virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
    bool m_isOr;
    QList<int> m_selectdList;
 
public:
    explicit SortFilterProxyModel(QSortFilterProxyModel *parent = nullptr);
 
    void ChangeFilterMode(bool isOr);        
    void ChangeFilterColumn( QList<int> selectdList);         
 
signals:
 
};
 
#endif // SORTFILTERPROXYMODEL_H

sortfilterproxymodel.cpp如下所示:

#include "sortfilterproxymodel.h"
#include <QDebug>
SortFilterProxyModel::SortFilterProxyModel(QSortFilterProxyModel *parent)
    : QSortFilterProxyModel(parent)
{
 
}
 
 
void SortFilterProxyModel::ChangeFilterMode(bool isOr)    
{
    m_isOr = isOr;
    invalidateFilter();
}
void SortFilterProxyModel::ChangeFilterColumn( QList<int> selectdList)     
{
    m_selectdList = selectdList;
    invalidateFilter();
}
 
 
bool SortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
 
    if(m_selectdList.isEmpty())
        return true;
 
    foreach(int column, m_selectdList) {
 
         QString data =  sourceModel()->index(source_row, column, source_parent).data(Qt::DisplayRole).toString();
 
         bool mathd = this->filterRegularExpression().match(data).hasMatch();
 
 
         if(m_isOr && mathd) {    
           return true;
         } else if(!m_isOr && !mathd) {     
             return false;
         }
 
    }
 
    if(m_isOr)          
        return false;
    else
        return true;
}
 
bool SortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
    //通過當(dāng)前視圖中的index位置獲取model中實(shí)際的數(shù)據(jù)
    QVariant leftData = sourceModel()->data(source_left);
    QVariant rightData = sourceModel()->data(source_right);
 
    switch ( source_left.column() )
    {
        case 0 :  
        case 3 :   
            return leftData.toInt() < rightData.toInt();
            break;
        default :    
            return leftData.toString() < rightData.toString();
            break;
    }
 
 
    return true;
 
}

到此這篇關(guān)于Qt利用QSortFilterProxyModel代理實(shí)現(xiàn)自定義排序與聯(lián)合過濾的文章就介紹到這了,更多相關(guān)Qt QSortFilterProxyModel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于curses庫實(shí)現(xiàn)彈球游戲

    基于curses庫實(shí)現(xiàn)彈球游戲

    這篇文章主要為大家詳細(xì)介紹了基于curses庫實(shí)現(xiàn)彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Qt無邊框窗口拖拽和陰影的實(shí)現(xiàn)

    Qt無邊框窗口拖拽和陰影的實(shí)現(xiàn)

    自定義窗口控件的無邊框,窗口事件由于沒有系統(tǒng)自帶邊框,無法實(shí)現(xiàn)拖拽拉伸等事件的處理,本文主要介紹了Qt無邊框窗口拖拽和陰影的實(shí)現(xiàn),感興趣的可以了解一下
    2024-01-01
  • C++ 中的異常拋出和捕獲方式

    C++ 中的異常拋出和捕獲方式

    這篇文章主要介紹了C++ 中的異常拋出和捕獲方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++頭文件algorithm中的函數(shù)功能詳解

    C++頭文件algorithm中的函數(shù)功能詳解

    這篇文章主要介紹了C++頭文件algorithm中的函數(shù)功能詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 深入解析C++中派生類的構(gòu)造函數(shù)

    深入解析C++中派生類的構(gòu)造函數(shù)

    這篇文章主要介紹了深入解析C++中派生類的構(gòu)造函數(shù),是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++重載運(yùn)算符實(shí)現(xiàn)分?jǐn)?shù)加減乘除

    C++重載運(yùn)算符實(shí)現(xiàn)分?jǐn)?shù)加減乘除

    這篇文章主要為大家詳細(xì)介紹了C++重載運(yùn)算符實(shí)現(xiàn)分?jǐn)?shù)加減乘除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法

    C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法

    今天小編就為大家分享一篇關(guān)于C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C語言項(xiàng)目爬樓梯的兩種實(shí)現(xiàn)方法參考

    C語言項(xiàng)目爬樓梯的兩種實(shí)現(xiàn)方法參考

    今天小編就為大家分享一篇關(guān)于C語言項(xiàng)目爬樓梯的兩種實(shí)現(xiàn)方法參考,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C語言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    C語言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。本文將用C語言實(shí)現(xiàn)這一經(jīng)典游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • C++ OpenCV學(xué)習(xí)之圖像像素值統(tǒng)計(jì)

    C++ OpenCV學(xué)習(xí)之圖像像素值統(tǒng)計(jì)

    在圖像分析的時(shí)候,我們經(jīng)常需要對單通道圖像的像素進(jìn)行統(tǒng)計(jì)。本文將主要介紹利用C++ OpenCV實(shí)現(xiàn)的圖像像素值統(tǒng)計(jì)的幾種方法,需要的可以參考一下
    2022-01-01

最新評論

多伦县| 南澳县| 新巴尔虎右旗| 民勤县| 巴楚县| 赤城县| 磴口县| 景宁| 永济市| 新疆| 台南县| 团风县| 静海县| 宁波市| 绵阳市| 泸西县| 北辰区| 新乡县| 祥云县| 郧西县| 武胜县| 嘉义市| 昌黎县| 呼和浩特市| 千阳县| 磴口县| 会泽县| 都匀市| 京山县| 翁源县| 寿阳县| 墨竹工卡县| 招远市| 静安区| 兴和县| 龙川县| 金塔县| 兴山县| 灵寿县| 正阳县| 聊城市|