Qt5中新的信号槽机制, 支持lamdba的新信号/槽. 那一串看起来诡异的[=](...){...}就是一串lamdba表达式. 这是C++11里面的新特性. 起初自己是对lamdba表达式不感冒的, 但是在学了NodeJs之后, 感觉lamdba真他妈赞! 如果理解这段代码有困难可以参考一下内容
在Model中需要稍微说明一下, 在这里面重载了两个函数一个是columnCount, 还有一个是flags.
columnCount在文档中是这么说明的
int QAbstractItemModel::columnCount(const QModelIndex & parent = QModelIndex()) const [pure virtual]
Returns the number of columns for the children of the given parent.
In most subclasses, the number of columns is independent of the parent.
For example:
int DomModel::columnCount(const QModelIndex &/*parent*/) const
{
return 3;
}
Note: When implementing a table based model, columnCount() should return 0 when the parent is valid.
而QFileSystemModel返回的数据包含很多我并不关心的内容, 比如文件大小, 最后修改时间等等..而我只需要的是返回起第一列, 也就是文件/目录名.
对于flags呢, 这是因为我需要使得Model中的数据可以编辑. 在文档中有这样的叙述:
To enable editing in your model, you must also implement setData(), and reimplement flags() to ensure that ItemIsEditable is returned.
因为QFileSystemModel中已经实现过setData了, 我们只需要保证flags的返回值都包含ItemIsEditable即可. 也是因为文档中的描述使我陷入误区, 在重新实现的flags中直接return Qt::ItemIsEditable; 但是结果并不是所期待的那样. 正确的做法在下面的代码中已经给出.
//ProjectExplorerModel.h
#ifndef PROJECTEXPLORERMODEL_H
#define PROJECTEXPLORERMODEL_H
#include <QFileSystemModel>
/**
* @brief The ProjectExplorerModel class 项目管理器的Model
*/
class ProjectExplorerModel : public QFileSystemModel
{
Q_OBJECT
public:
explicit ProjectExplorerModel(QObject *parent = 0);
/**
* @brief columnCount 重载, 目的是只显示FileSystemModel的第一列
* @param parent 不需要
* @return 显示的列数
*/
int columnCount(const QModelIndex &parent) const;
//To enable editing in your model, you must also implement setData(),
//and reimplement flags() to ensure that ItemIsEditable is returned.
Qt::ItemFlags flags(const QModelIndex &index) const;
};
#endif // PROJECTEXPLORERMODEL_H
//ProjectExplorerModel.cpp
#include "ProjectExplorerModel.h"
ProjectExplorerModel::ProjectExplorerModel(QObject *parent)
: QFileSystemModel(parent)
{
}
int ProjectExplorerModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 1;
}
Qt::ItemFlags ProjectExplorerModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flag = QFileSystemModel::flags(index);
flag |= Qt::ItemIsEditable;
return flag;
}
最后是懂Qt的Delegate的画ProjectExplorerItemDelegate的代码这里也比较简单, 可能就是在createEditor函数里面这一段稍微难理解一些:
QRegExp rx(R"([^\/:*?"<>|]{1,255})");
QValidator *pValidator = new QRegExpValidator(rx/*, this*/);//bug
pLineEdit->setValidator(pValidator);