当前位置:首页 > 芯闻号 > 充电吧
[导读]在使用Qt的树形视图和表格视图QTableView和QTreeView时,经常需要遍历所有条目,每种功能都写一个遍历函数既麻烦又不符合编程最简原则,因此,写一个通用的遍历函数是很必要的(类似于std:

在使用Qt的树形视图和表格视图QTableView和QTreeView时,经常需要遍历所有条目,每种功能都写一个遍历函数既麻烦又不符合编程最简原则,因此,写一个通用的遍历函数是很必要的(类似于std::for_each),对于遍历时实现的功能不一样,可以通过函数指针来代替需要实现的功能。
在讲这个之前,需要了解std::function和std::bind,具体可以自行谷歌。 可参考:http://blog.csdn.net/qq575787460/article/details/8531397
由于这个遍历函数可能经常用到,因此可以写一个类的静态函数或者是全局函数。
下面把这个功能封装在一个类里
类的头文件如下:

#include#includeclass QStandardItemModelEx
 {
 public:
     QStandardItemModelEx(){}
     ~QStandardItemModelEx(){}
     ///
     /// brief callback_ergodicFun_ptr 回调函数指针,bool f(QStandardItem*),bool用于决定是否继续,如果为true就继续递归,如果为false就停止递归
     ///
     typedef std::functioncallback_ergodicFun_ptr;

     //typedef void(*callback_ergodicFun_ptr)(QStandardItem*);
     static void ergodicAllItem(QStandardItemModel* model,callback_ergodicFun_ptr pFun);
     static bool ergodicItem(QStandardItem* item,callback_ergodicFun_ptr pFun);
 private:
 };


这里使用C++11的新特性function(环境 VS2010),定义一个函数指针用于回调实现功能。 函数ergodicAllItem用于遍历所有项目,ergodicItem用于遍历项目下的所有子项目。回调函数返回bool用于决定是否继续,如果为true就继续遍历,如果为false就停止遍历 为了简单起见,下面用递归实现遍历(ergodicItem是尾递归函数)  

void QStandardItemModelEx::ergodicAllItem(QStandardItemModel* model,callback_ergodicFun_ptr pFun)
{
    int rows = model->rowCount();
    int column = model->columnCount();
    for (int i=0;i<rows;++i)
    {
        for(int j=0;jitem(i,j);
            if (item)
            {
                if(!ergodicItem(item,pFun))
                    return;
            }
        }
    }
}

bool QStandardItemModelEx::ergodicItem(QStandardItem* item,callback_ergodicFun_ptr pFun)
{
    int rows = item->rowCount();
    int column = item->columnCount();
    for (int i=0;i<rows;++i)
    {
        for(int j=0;jchild(i,j);
            if (childItem)
            {
                if(!ergodicItem(childItem,pFun))
                    return false;
            }
        }
    }
    return pFun(item);
}





用这两个函数就可以遍历所有的项目了,而遍历时需要的动作,就通过回调函数实现。
回调函数即可写在类里,也可以写为全局函数,若除了QStandardItem*还需要别的参数,那么可以用std::bind帮忙。
下面举一个例子 例子功能是通过关键字高亮条目。在使用QTreeView或QTableView时,在条目多的情况下,需要搜索某些条目,对搜索结果进行高亮,这时,就需要遍历整个View里的条目,对符合的条目进行高亮 遍历的函数已经写好,现在缺少的是回调的函数,由于遍历的函数使用的函数指针是std::function,因此回调函数即可写为全局函数也可以写为类成员函数 回调函数声明:

bool callback_hightLightItem(QStandardItem* item,const QStringList keys);

回调函数实现:

bool callback_hightLightItem(QStandardItem* item,const QStringList keys)
{   
    QString str = item->text();
    if (is_match_string(str,keys))
    {
        item->setData(QVariant(QColor(237,100,100,180)),Qt::BackgroundRole);
    }
    else
    {
        item->setData(QVariant(),Qt::BackgroundRole);
    }
    return true;
}


使用QStandardItem的setData函数,设置角色为Qt::BackgroundRole,即可设置背景颜色。 实现函数中is_match_string函数是用来检测是否符合关键字,如果符合关键字,就返回true,符合关键字就给条目背景赋予不同的颜色,否则就把颜色消除。 回调函数返回true,意味着一直遍历,直到所有遍历完成。
通过按钮pushButton_search来触发搜索功能。pushButton_search函数的槽如下:void MainWindow::on_pushButton_search_clicked()
{
    QString str = ui->lineEdit_search->text();//获取关键字
    if (str.isEmpty())
        return;
    QStringList keyWords = str.split(QString(" "));
    StandardItemModel::ergodicAllItem(
        qobject_cast

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘 要 :为解决制鞋行业中喷胶精度不高、灵活性差、生产效率低的问题,设计一种基于机器视觉的鞋模喷胶系统。该系统硬件由工业摄像头、工控机及路由器构成,软件则采用图像识别库 OpenCV 与图形界面应用程序开发框架 Qt 编...

关键字: 机器视觉 图像处理 鞋模 喷胶 OpenCV QT

嵌入式系统是指以应用为中心、以计算机技术为基础,软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

关键字: QT 嵌入式 C++

摘 要:仓储作为物流与供应链的核心环节,对食品安全的控制起着至关重要的作用。温湿度是影响粮食仓储过程安全与品质的重要因素。文中使用无线传感网络进行数据采集,通过Qt平台设计软件系统,并借助数据库进行数据存储与分析处理,实...

关键字: 成品粮 仓储 温湿度监测 无线传感网络 QT

在此部件上绘制行号,并将其放置在CodeEditor的viewport()的左边距区域上,QWidget类也可以帮助我们对其内容进行滚动。

关键字: QT 代码编辑器

不管是Qt新手还是开发过qt的群体来说,对Qt Designer、Qt Quick Designer、Qt Creator这几个应用程序肯定是熟悉的。

关键字: QT IDE C

在当今社会,人们的生活水平普遍提高,工作强度越来越大,营养的过剩和运动量的减少,导致心脑血管疾病的发病率是越来越高。

关键字: Linux QT GPRS 远程集群式 心脏病人实时诊断系

qt值得学习吗? 嵌入式要学的东西真的很多,我们可能会说不写界面的话就不用学qt了?我不赞同。

关键字: 嵌入式 QT UI

什么是qt?简单点说,Qt 就是一个跨平台的 C++ 图形用户界面库,可以同时支持桌面应用程序开发、嵌入式开发和移动开发,覆盖了现有的所有主流平台。

关键字: QT 程序 开发

qt值得学习吗? 嵌入式要学的东西真的很多,我们可能会说不写界面的话就不用学qt了?我不赞同,原因是……

关键字: 嵌入式 QT

c++程序员面试过程中基本上都会被问到c++11新特性吧,你是怎么回答的呢? 本文基本上涵盖了c++11的所有新特性,并有详细代码介绍其用法,对关键知识点做了深入分析,对重要的知识点我单独写了相关文章并附上了相关链接,我...

关键字: c++11
关闭
关闭