#include <QStandardItemModel>
#include <functional>
class QStandardItemModelEx
{
public:
QStandardItemModelEx(){}
~QStandardItemModelEx(){}
///
/// \brief callback_ergodicFun_ptr 回調函數指針,bool f(QStandardItem*),bool用於決定是否繼續,如果爲true就繼續遞歸,如果爲false就停止遞歸
///
typedef std::function<bool(QStandardItem*)> callback_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:
};
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;j<column;++j)
{
QStandardItem* item = model->item(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;j<column;++j)
{
QStandardItem* childItem = item->child(i,j);
if (childItem)
{
if(!ergodicItem(childItem,pFun))
return false;
}
}
}
return pFun(item);
}
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;
}
{
QString str = ui->lineEdit_search->text();//獲取關鍵字
if (str.isEmpty())
return;
QStringList keyWords = str.split(QString(" "));
StandardItemModel::ergodicAllItem(
qobject_cast<QStandardItemModel*>(ui->treeView->model())
,std::bind(callback_hightLightItem,std::placeholders::_1,keyWords));//對於callback_hightLightItem是全局函數的情況下
}
bool callback_hightLightItem(QStandardItem* item,const QStringList keys);
我們要把他轉換爲如下類型的函數指針bool(QStandardItem*)
bool callback_hightLightItem(const QStringList keys,QStandardItem* item);
那麼寫法變爲:std::bind(callback_hightLightItem,keyWords,std::placeholders::_1);
qobject_cast<QStandardItemModel*>(ui->treeView->model())
,std::bind(&MainWindow::callback_hightLightItem,this,std::placeholders::_1,keyWords));