基于Qt/C++的ProjectExplorer实现(2)

Qt5中新的信号槽机制, 支持lamdba的新信号/槽. 那一串看起来诡异的[=](...){...}就是一串lamdba表达式. 这是C++11里面的新特性. 起初自己是对lamdba表达式不感冒的, 但是在学了NodeJs之后, 感觉lamdba真他妈赞! 如果理解这段代码有困难可以参考一下内容

c++11 中的lamdba 

Qt5中对C++11一些新特性封装 

在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);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5caba20ec6f3ceed823038ed8f512224.html