nodetreeview.cpp

nodetreemodel.h
develop
zhangshuoshuo 3 months ago
parent 85254c8e29
commit 26aaeff0b3

@ -10,121 +10,126 @@
#include "nodedata.h"
#include "dbmanager.h"
#include "nodepath.h"
// NodeItem 命名空间,定义角色和类型枚举
namespace NodeItem {
enum Roles {
ItemType = Qt::UserRole,
DisplayText = Qt::DisplayRole,
Icon = Qt::DecorationRole,
TagColor = Qt::UserRole + 1,
IsExpandable,
AbsPath,
RelPos,
ChildCount,
NodeId
ItemType = Qt::UserRole, // 项类型
DisplayText = Qt::DisplayRole, // 显示文本
Icon = Qt::DecorationRole, // 图标
TagColor = Qt::UserRole + 1, // 标签颜色
IsExpandable, // 是否可展开
AbsPath, // 绝对路径
RelPos, // 相对位置
ChildCount, // 子项数量
NodeId // 节点ID
};
enum Type {
AllNoteButton = 1,
// We store this enum inside QVariant,
// and an invalid QVariant conversion return 0
TrashButton,
FolderSeparator,
TagSeparator,
FolderItem,
NoteItem,
TagItem,
RootItem
AllNoteButton = 1, // 所有笔记按钮
TrashButton, // 垃圾桶按钮
FolderSeparator, // 文件夹分隔符
TagSeparator, // 标签分隔符
FolderItem, // 文件夹项
NoteItem, // 笔记项
TagItem, // 标签项
RootItem // 根项
};
} // namespace NodeItem
class NodeTreeItem
class NodeTreeItem// NodeTreeItem 类,表示树中的一个节点
{
public:
explicit NodeTreeItem(const QHash<NodeItem::Roles, QVariant> &data,
NodeTreeItem *parentItem = nullptr);
~NodeTreeItem();
NodeTreeItem *parentItem = nullptr); // 构造函数
~NodeTreeItem(); // 析构函数
void appendChild(NodeTreeItem *child);
void insertChild(int row, NodeTreeItem *child);
NodeTreeItem *child(int row);
void removeChild(int row);
NodeTreeItem *takeChildAt(int row);
int childCount() const;
int columnCount() const;
int recursiveNodeCount() const;
void recursiveUpdateFolderPath(const QString &oldP, const QString &newP);
QVariant data(NodeItem::Roles role) const;
void setData(NodeItem::Roles role, const QVariant &d);
int row() const;
NodeTreeItem *parentItem();
void setParentItem(NodeTreeItem *parentItem);
void moveChild(int from, int to);
void recursiveSort();
void appendChild(NodeTreeItem *child); // 添加子节点
void insertChild(int row, NodeTreeItem *child); // 在指定位置插入子节点
NodeTreeItem *child(int row); // 获取指定位置的子节点
void removeChild(int row); // 移除指定位置的子节点
NodeTreeItem *takeChildAt(int row); // 移除并返回指定位置的子节点
int childCount() const; // 获取子节点数量
int columnCount() const; // 获取列数
int recursiveNodeCount() const; // 递归获取节点数量
void recursiveUpdateFolderPath(const QString &oldP, const QString &newP); // 递归更新文件夹路径
QVariant data(NodeItem::Roles role) const; // 获取指定角色的数据
void setData(NodeItem::Roles role, const QVariant &d); // 设置指定角色的数据
int row() const; // 获取当前节点的行号
NodeTreeItem *parentItem(); // 获取父节点
void setParentItem(NodeTreeItem *parentItem); // 设置父节点
void moveChild(int from, int to); // 移动子节点
void recursiveSort(); // 递归排序
private:
QVector<NodeTreeItem *> m_childItems;
QHash<NodeItem::Roles, QVariant> m_itemData;
NodeTreeItem *m_parentItem;
QVector<NodeTreeItem *> m_childItems; // 子节点列表
QHash<NodeItem::Roles, QVariant> m_itemData; // 节点数据
NodeTreeItem *m_parentItem; // 父节点
};
class NodeTreeModel : public QAbstractItemModel
class NodeTreeModel : public QAbstractItemModel// NodeTreeModel 类,继承自 QAbstractItemModel
{
Q_OBJECT
public:
explicit NodeTreeModel(QObject *parent = nullptr);
~NodeTreeModel();
explicit NodeTreeModel(QObject *parent = nullptr); // 构造函数
~NodeTreeModel(); // 析构函数
void appendChildNodeToParent(const QModelIndex &parentIndex,
const QHash<NodeItem::Roles, QVariant> &data);
QModelIndex rootIndex() const;
QModelIndex folderIndexFromIdPath(const NodePath &idPath);
QModelIndex tagIndexFromId(int id);
QString getNewFolderPlaceholderName(const QModelIndex &parentIndex);
QString getNewTagPlaceholderName();
QVector<QModelIndex> getSeparatorIndex();
QModelIndex getDefaultNotesIndex();
QModelIndex getAllNotesButtonIndex();
QModelIndex getTrashButtonIndex();
void deleteRow(const QModelIndex &rowIndex, const QModelIndex &parentIndex);
void
appendChildNodeToParent(const QModelIndex &parentIndex,
const QHash<NodeItem::Roles, QVariant> &data); // 向父节点添加子节点
QModelIndex rootIndex() const; // 获取根节点索引
QModelIndex folderIndexFromIdPath(const NodePath &idPath); // 根据ID路径获取文件夹索引
QModelIndex tagIndexFromId(int id); // 根据ID获取标签索引
QString getNewFolderPlaceholderName(const QModelIndex &parentIndex); // 获取新文件夹占位符名称
QString getNewTagPlaceholderName(); // 获取新标签占位符名称
QVector<QModelIndex> getSeparatorIndex(); // 获取分隔符索引
QModelIndex getDefaultNotesIndex(); // 获取默认笔记索引
QModelIndex getAllNotesButtonIndex(); // 获取所有笔记按钮索引
QModelIndex getTrashButtonIndex(); // 获取垃圾桶按钮索引
void deleteRow(const QModelIndex &rowIndex, const QModelIndex &parentIndex); // 删除行
public slots:
void setTreeData(const NodeTagTreeData &treeData);
void setTreeData(const NodeTagTreeData &treeData); // 设置树数据
// QAbstractItemModel interface
// QAbstractItemModel interface接口实现
public:
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const override;
virtual QModelIndex parent(const QModelIndex &index) const override;
virtual int rowCount(const QModelIndex &parent) const override;
virtual int columnCount(const QModelIndex &parent) const override;
virtual QVariant data(const QModelIndex &index, int role) const override;
virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
virtual bool setData(const QModelIndex &index, const QVariant &value, int role) override;
virtual Qt::DropActions supportedDropActions() const override;
virtual Qt::DropActions supportedDragActions() const override;
virtual QStringList mimeTypes() const override;
virtual QMimeData *mimeData(const QModelIndexList &indexes) const override;
virtual QModelIndex index(int row, int column,
const QModelIndex &parent) const override; // 获取索引
virtual QModelIndex parent(const QModelIndex &index) const override; // 获取父索引
virtual int rowCount(const QModelIndex &parent) const override; // 获取行数
virtual int columnCount(const QModelIndex &parent) const override; // 获取列数
virtual QVariant data(const QModelIndex &index, int role) const override; // 获取数据
virtual Qt::ItemFlags flags(const QModelIndex &index) const override; // 获取项目标志
virtual bool setData(const QModelIndex &index, const QVariant &value,
int role) override; // 设置数据
virtual Qt::DropActions supportedDropActions() const override; // 支持的拖放动作
virtual Qt::DropActions supportedDragActions() const override; // 支持的拖动动作
virtual QStringList mimeTypes() const override; // 支持的MIME类型
virtual QMimeData *mimeData(const QModelIndexList &indexes) const override; // 获取MIME数据
virtual bool dropMimeData(const QMimeData *mime, Qt::DropAction action, int row, int column,
const QModelIndex &parent) override;
const QModelIndex &parent) override; // 处理拖放数据
signals:
void topLevelItemLayoutChanged();
void requestExpand(const QString &indexPath);
void requestMoveNode(int nodeId, int targetId);
void requestUpdateNodeRelativePosition(int nodeId, int relativePosition);
void requestUpdateTagRelativePosition(int nodeId, int relativePosition);
void requestUpdateAbsPath(const QString &oldPath, const QString &newPath);
void dropFolderSuccessful(const QString &paths);
void dropTagsSuccessful(const QSet<int> &ids);
void requestMoveFolderToTrash(const QModelIndex &index);
void topLevelItemLayoutChanged(); // 顶层项目布局变化信号
void requestExpand(const QString &indexPath); // 请求展开信号
void requestMoveNode(int nodeId, int targetId); // 请求移动节点信号
void requestUpdateNodeRelativePosition(int nodeId,
int relativePosition); // 请求更新节点相对位置信号
void requestUpdateTagRelativePosition(int nodeId,
int relativePosition); // 请求更新标签相对位置信号
void requestUpdateAbsPath(const QString &oldPath,
const QString &newPath); // 请求更新绝对路径信号
void dropFolderSuccessful(const QString &paths); // 文件夹拖放成功信号
void dropTagsSuccessful(const QSet<int> &ids); // 标签拖放成功信号
void requestMoveFolderToTrash(const QModelIndex &index); // 请求移动文件夹到垃圾桶信号
private:
NodeTreeItem *rootItem;
void loadNodeTree(const QVector<NodeData> &nodeData, NodeTreeItem *rootNode);
void appendAllNotesAndTrashButton(NodeTreeItem *rootNode);
void appendFolderSeparator(NodeTreeItem *rootNode);
void appendTagsSeparator(NodeTreeItem *rootNode);
void loadTagList(const QVector<TagData> &tagData, NodeTreeItem *rootNode);
void updateChildRelativePosition(NodeTreeItem *parent, const NodeItem::Type type);
NodeTreeItem *rootItem; // 根节点
void loadNodeTree(const QVector<NodeData> &nodeData, NodeTreeItem *rootNode); // 加载节点树
void appendAllNotesAndTrashButton(NodeTreeItem *rootNode); // 添加所有笔记和垃圾桶按钮
void appendFolderSeparator(NodeTreeItem *rootNode); // 添加文件夹分隔符
void appendTagsSeparator(NodeTreeItem *rootNode); // 添加标签分隔符
void loadTagList(const QVector<TagData> &tagData, NodeTreeItem *rootNode); // 加载标签列表
void updateChildRelativePosition(NodeTreeItem *parent,
const NodeItem::Type type); // 更新子节点相对位置
};
#endif // NODETREEMODEL_H

@ -10,59 +10,60 @@
#include <QScrollBar>
#include "nodetreeview_p.h"
NodeTreeView::NodeTreeView(QWidget *parent)
NodeTreeView::NodeTreeView(QWidget *parent)// 构造函数,初始化 NodeTreeView
: QTreeView(parent),
m_isContextMenuOpened{ false },
m_isEditing{ false },
m_ignoreThisCurrentLoad{ false },
m_isLastSelectedFolder{ false }
{
setHeaderHidden(true);
setHeaderHidden(true);// 隐藏表头
QFile file(":/styles/nodetreeview.css");
file.open(QFile::ReadOnly);
setStyleSheet(file.readAll());
setStyleSheet(file.readAll());// 设置样式表
#if (defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)) || defined(Q_OS_WIN) || defined(Q_OS_WINDOWS)
QFile scollBarStyleFile(QStringLiteral(":/styles/components/custom-scrollbar.css"));
scollBarStyleFile.open(QFile::ReadOnly);
QString scrollbarStyleSheet = QString::fromLatin1(scollBarStyleFile.readAll());
verticalScrollBar()->setStyleSheet(scrollbarStyleSheet);
verticalScrollBar()->setStyleSheet(scrollbarStyleSheet);// 设置滚动条样式
#endif
setRootIsDecorated(false);
setMouseTracking(true);
setSelectionMode(QAbstractItemView::MultiSelection);
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, &QWidget::customContextMenuRequested, this, &NodeTreeView::onCustomContextMenu);
contextMenu = new QMenu(this);
renameFolderAction = new QAction(tr("Rename Folder"), this);
setRootIsDecorated(false); // 不显示根节点的装饰
setMouseTracking(true); // 启用鼠标跟踪
setSelectionMode(QAbstractItemView::MultiSelection); // 设置选择模式为多选
setContextMenuPolicy(Qt::CustomContextMenu); // 设置上下文菜单策略为自定义
connect(this, &QWidget::customContextMenuRequested, this,
&NodeTreeView::onCustomContextMenu); // 连接自定义上下文菜单信号
contextMenu = new QMenu(this); // 创建上下文菜单
renameFolderAction = new QAction(tr("Rename Folder"), this);// 创建和连接重命名文件夹动作
connect(renameFolderAction, &QAction::triggered, this, [this] {
setIsEditing(true);
emit renameFolderRequested();
});
deleteFolderAction = new QAction(tr("Delete Folder"), this);
deleteFolderAction = new QAction(tr("Delete Folder"), this);// 创建和连接删除文件夹动作
connect(deleteFolderAction, &QAction::triggered, this, &NodeTreeView::onDeleteNodeAction);
addSubfolderAction = new QAction(tr("Add Subfolder"), this);
addSubfolderAction = new QAction(tr("Add Subfolder"), this);// 创建和连接添加子文件夹动作
connect(addSubfolderAction, &QAction::triggered, this, &NodeTreeView::addFolderRequested);
renameTagAction = new QAction(tr("Rename Tag"), this);
renameTagAction = new QAction(tr("Rename Tag"), this);// 创建和连接重命名标签动作
connect(renameTagAction, &QAction::triggered, this, [this] {
setIsEditing(true);
emit renameTagRequested();
});
changeTagColorAction = new QAction(tr("Change Tag Color"), this);
changeTagColorAction = new QAction(tr("Change Tag Color"), this); // 创建和连接更改标签颜色动作
connect(changeTagColorAction, &QAction::triggered, this, &NodeTreeView::onChangeTagColorAction);
deleteTagAction = new QAction(tr("Delete Tag"), this);
deleteTagAction = new QAction(tr("Delete Tag"), this);// 创建和连接删除标签动作
connect(deleteTagAction, &QAction::triggered, this, &NodeTreeView::onDeleteNodeAction);
clearSelectionAction = new QAction(tr("Clear Selection"), this);
clearSelectionAction = new QAction(tr("Clear Selection"), this);// 创建和连接清除选择动作
connect(clearSelectionAction, &QAction::triggered, this, [this] {
closeCurrentEditor();
clearSelection();
setCurrentIndexC(dynamic_cast<NodeTreeModel *>(model())->getAllNotesButtonIndex());
});
contextMenuTimer.setInterval(100);
contextMenuTimer.setInterval(100);// 设置上下文菜单定时器
contextMenuTimer.setSingleShot(true);
connect(&contextMenuTimer, &QTimer::timeout, this, [this] {
if (!m_isEditing) {
@ -70,19 +71,19 @@ NodeTreeView::NodeTreeView(QWidget *parent)
}
});
connect(contextMenu, &QMenu::aboutToHide, this, [this] {
connect(contextMenu, &QMenu::aboutToHide, this, [this] { // 连接上下文菜单隐藏信号
m_isContextMenuOpened = false;
// this signal is emitted before QAction::triggered
contextMenuTimer.start();
});
connect(this, &NodeTreeView::expanded, this, &NodeTreeView::onExpanded);
connect(this, &NodeTreeView::expanded, this, &NodeTreeView::onExpanded);// 连接展开和收起信号
connect(this, &NodeTreeView::collapsed, this, &NodeTreeView::onCollapsed);
setDragEnabled(true);
setAcceptDrops(true);
setSelectionMode(QAbstractItemView::SingleSelection);
setDragEnabled(true); // 启用拖动
setAcceptDrops(true); // 启用接受拖放
setSelectionMode(QAbstractItemView::SingleSelection); // 设置选择模式为单选
}
// 删除节点动作
void NodeTreeView::onDeleteNodeAction()
{
auto itemType = static_cast<NodeItem::Type>(
@ -98,29 +99,29 @@ void NodeTreeView::onDeleteNodeAction()
emit deleteTagRequested(index);
}
}
// 节点展开时的处理
void NodeTreeView::onExpanded(const QModelIndex &index)
{
m_expanded.push_back(index.data(NodeItem::Roles::AbsPath).toString());
emit saveExpand(QStringList::fromVector(m_expanded));
}
// 节点收起时的处理
void NodeTreeView::onCollapsed(const QModelIndex &index)
{
m_expanded.removeAll(index.data(NodeItem::Roles::AbsPath).toString());
emit saveExpand(QStringList::fromVector(m_expanded));
}
// 获取当前编辑的索引
const QModelIndex &NodeTreeView::currentEditingIndex() const
{
return m_currentEditingIndex;
}
// 设置忽略当前加载
void NodeTreeView::setIgnoreThisCurrentLoad(bool newIgnoreThisCurrentLoad)
{
m_ignoreThisCurrentLoad = newIgnoreThisCurrentLoad;
}
// 文件夹拖放成功时的处理
void NodeTreeView::onFolderDropSuccessful(const QString &path)
{
auto m_model = dynamic_cast<NodeTreeModel *>(model());
@ -131,7 +132,7 @@ void NodeTreeView::onFolderDropSuccessful(const QString &path)
setCurrentIndexC(m_model->getAllNotesButtonIndex());
}
}
// 标签拖放成功时的处理
void NodeTreeView::onTagsDropSuccessful(const QSet<int> &ids)
{
auto m_model = dynamic_cast<NodeTreeModel *>(model());
@ -151,18 +152,18 @@ void NodeTreeView::onTagsDropSuccessful(const QSet<int> &ids)
setCurrentIndexC(m_model->getAllNotesButtonIndex());
}
}
// 获取主题
Theme::Value NodeTreeView::theme() const
{
return m_theme;
}
bool NodeTreeView::isDragging() const
bool NodeTreeView::isDragging() const// 是否正在拖动
{
return state() == DraggingState;
}
void NodeTreeView::reExpandC()
void NodeTreeView::reExpandC()// 重新展开节点
{
auto needExpand = std::move(m_expanded);
m_expanded.clear();
@ -176,14 +177,14 @@ void NodeTreeView::reExpandC()
}
}
void NodeTreeView::reExpandC(const QStringList &expanded)
void NodeTreeView::reExpandC(const QStringList &expanded)// 重新展开节点(带参数)
{
m_expanded.clear();
m_expanded = expanded.toVector();
reExpandC();
}
void NodeTreeView::onChangeTagColorAction()
void NodeTreeView::onChangeTagColorAction()// 更改标签颜色动作
{
auto itemType = static_cast<NodeItem::Type>(
m_currentEditingIndex.data(NodeItem::Roles::ItemType).toInt());
@ -193,13 +194,13 @@ void NodeTreeView::onChangeTagColorAction()
}
}
void NodeTreeView::onRequestExpand(const QString &folderPath)
void NodeTreeView::onRequestExpand(const QString &folderPath)// 请求展开节点
{
auto m_model = dynamic_cast<NodeTreeModel *>(model());
expand(m_model->folderIndexFromIdPath(folderPath));
}
void NodeTreeView::onUpdateAbsPath(const QString &oldPath, const QString &newPath)
void NodeTreeView::onUpdateAbsPath(const QString &oldPath, const QString &newPath)// 更新绝对路径
{
std::transform(m_expanded.begin(), m_expanded.end(), m_expanded.begin(), [&](QString s) {
s.replace(s.indexOf(oldPath), oldPath.size(), newPath);
@ -207,7 +208,7 @@ void NodeTreeView::onUpdateAbsPath(const QString &oldPath, const QString &newPat
});
}
void NodeTreeView::updateEditingIndex(QPoint pos)
void NodeTreeView::updateEditingIndex(QPoint pos)// 更新编辑索引
{
auto index = indexAt(pos);
if (indexAt(pos) != m_currentEditingIndex && !m_isContextMenuOpened && !m_isEditing) {
@ -224,13 +225,13 @@ void NodeTreeView::updateEditingIndex(QPoint pos)
}
}
void NodeTreeView::closeCurrentEditor()
void NodeTreeView::closeCurrentEditor()// 关闭当前编辑器
{
closePersistentEditor(m_currentEditingIndex);
m_currentEditingIndex = QModelIndex();
}
void NodeTreeView::selectionChanged(const QItemSelection &selected,
void NodeTreeView::selectionChanged(const QItemSelection &selected,// 选择发生变化时的处理
const QItemSelection &deselected)
{
QTreeView::selectionChanged(selected, deselected);
@ -289,7 +290,7 @@ void NodeTreeView::selectionChanged(const QItemSelection &selected,
}
}
void NodeTreeView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
void NodeTreeView::currentChanged(const QModelIndex &current, const QModelIndex &previous)// 当前索引发生变化时的处理
{
QTreeView::currentChanged(current, previous);
auto itemType = static_cast<NodeItem::Type>(current.data(NodeItem::Roles::ItemType).toInt());
@ -302,7 +303,7 @@ void NodeTreeView::currentChanged(const QModelIndex &current, const QModelIndex
}
}
void NodeTreeView::dragEnterEvent(QDragEnterEvent *event)
void NodeTreeView::dragEnterEvent(QDragEnterEvent *event)// 拖动进入事件
{
if (event->mimeData()->hasFormat(NOTE_MIME)) {
event->acceptProposedAction();
@ -311,7 +312,7 @@ void NodeTreeView::dragEnterEvent(QDragEnterEvent *event)
}
}
void NodeTreeView::dragMoveEvent(QDragMoveEvent *event)
void NodeTreeView::dragMoveEvent(QDragMoveEvent *event)// 拖动移动事件
{
if (event->mimeData()->hasFormat(NOTE_MIME)) {
auto index = indexAt(event->pos());
@ -349,13 +350,13 @@ void NodeTreeView::dragMoveEvent(QDragMoveEvent *event)
}
}
void NodeTreeView::reset()
void NodeTreeView::reset()// 重置视图
{
closeCurrentEditor();
reExpandC();
}
void NodeTreeView::dropEvent(QDropEvent *event)
void NodeTreeView::dropEvent(QDropEvent *event)// 拖放事件
{
if (event->mimeData()->hasFormat(NOTE_MIME)) {
auto dropIndex = indexAt(event->pos());
@ -385,12 +386,12 @@ void NodeTreeView::dropEvent(QDropEvent *event)
}
}
void NodeTreeView::setIsEditing(bool newIsEditing)
void NodeTreeView::setIsEditing(bool newIsEditing)// 设置是否正在编辑
{
m_isEditing = newIsEditing;
}
void NodeTreeView::onRenameFolderFinished(const QString &newName)
void NodeTreeView::onRenameFolderFinished(const QString &newName)// 重命名文件夹完成
{
if (m_currentEditingIndex.isValid()) {
auto itemType = static_cast<NodeItem::Type>(
@ -407,7 +408,7 @@ void NodeTreeView::onRenameFolderFinished(const QString &newName)
}*/
}
void NodeTreeView::onRenameTagFinished(const QString &newName)
void NodeTreeView::onRenameTagFinished(const QString &newName)// 重命名标签完成
{
if (m_currentEditingIndex.isValid()) {
auto itemType = static_cast<NodeItem::Type>(
@ -424,7 +425,7 @@ void NodeTreeView::onRenameTagFinished(const QString &newName)
}*/
}
void NodeTreeView::setCurrentIndexC(const QModelIndex &index)
void NodeTreeView::setCurrentIndexC(const QModelIndex &index)// 设置当前索引
{
setCurrentIndex(index);
clearSelection();
@ -432,18 +433,18 @@ void NodeTreeView::setCurrentIndexC(const QModelIndex &index)
selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent);
}
void NodeTreeView::setCurrentIndexNC(const QModelIndex &index)
void NodeTreeView::setCurrentIndexNC(const QModelIndex &index)// 设置当前索引(不改变选择模式)
{
setCurrentIndex(index);
}
void NodeTreeView::setTheme(Theme::Value theme)
void NodeTreeView::setTheme(Theme::Value theme)// 设置主题
{
setCSSThemeAndUpdate(this, theme);
m_theme = theme;
}
void NodeTreeView::onCustomContextMenu(QPoint point)
void NodeTreeView::onCustomContextMenu(QPoint point)// 自定义上下文菜单请求
{
QModelIndex index = indexAt(point);
if (index.isValid()) {
@ -471,7 +472,7 @@ void NodeTreeView::onCustomContextMenu(QPoint point)
}
}
void NodeTreeView::setTreeSeparator(const QVector<QModelIndex> &newTreeSeparator,
void NodeTreeView::setTreeSeparator(const QVector<QModelIndex> &newTreeSeparator,// 设置树分隔符
const QModelIndex &defaultNotesIndex)
{
for (const auto &sep : qAsConst(m_treeSeparator)) {
@ -484,7 +485,7 @@ void NodeTreeView::setTreeSeparator(const QVector<QModelIndex> &newTreeSeparator
m_defaultNotesIndex = defaultNotesIndex;
}
void NodeTreeView::mouseMoveEvent(QMouseEvent *event)
void NodeTreeView::mouseMoveEvent(QMouseEvent *event)// 鼠标移动事件
{
Q_D(NodeTreeView);
QPoint topLeft;
@ -511,7 +512,7 @@ void NodeTreeView::mouseMoveEvent(QMouseEvent *event)
}
}
void NodeTreeView::mousePressEvent(QMouseEvent *event)
void NodeTreeView::mousePressEvent(QMouseEvent *event)// 鼠标按下事件
{
Q_D(NodeTreeView);
d->delayedAutoScroll.stop();
@ -577,7 +578,7 @@ void NodeTreeView::mousePressEvent(QMouseEvent *event)
updateEditingIndex(event->pos());
}
void NodeTreeView::leaveEvent(QEvent *event)
void NodeTreeView::leaveEvent(QEvent *event)// 离开事件
{
if (!m_isContextMenuOpened && !m_isEditing) {
closeCurrentEditor();
@ -585,7 +586,7 @@ void NodeTreeView::leaveEvent(QEvent *event)
}
}
void NodeTreeView::mouseReleaseEvent(QMouseEvent *event)
void NodeTreeView::mouseReleaseEvent(QMouseEvent *event)// 鼠标释放
{
Q_UNUSED(event);
Q_D(NodeTreeView);
@ -612,7 +613,7 @@ void NodeTreeView::mouseReleaseEvent(QMouseEvent *event)
d->pressedIndex = QPersistentModelIndex();
}
void NodeTreeView::mouseDoubleClickEvent(QMouseEvent *event)
void NodeTreeView::mouseDoubleClickEvent(QMouseEvent *event)// 鼠标双击
{
Q_UNUSED(event);
Q_D(NodeTreeView);

Loading…
Cancel
Save