From 26aaeff0b3af44f9abbc6aa6e36fb74a6492e9fc Mon Sep 17 00:00:00 2001 From: zhangshuoshuo <213891190@qq.com> Date: Thu, 9 Jan 2025 14:39:51 +0800 Subject: [PATCH] nodetreeview.cpp nodetreemodel.h --- source/src/nodetreemodel.h | 179 ++++++++++++++++++------------------ source/src/nodetreeview.cpp | 117 +++++++++++------------ 2 files changed, 151 insertions(+), 145 deletions(-) diff --git a/source/src/nodetreemodel.h b/source/src/nodetreemodel.h index 3117a8a..f2d19c0 100644 --- a/source/src/nodetreemodel.h +++ b/source/src/nodetreemodel.h @@ -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 &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 m_childItems; - QHash m_itemData; - NodeTreeItem *m_parentItem; + QVector m_childItems; // 子节点列表 + QHash 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 &data); - QModelIndex rootIndex() const; - QModelIndex folderIndexFromIdPath(const NodePath &idPath); - QModelIndex tagIndexFromId(int id); - QString getNewFolderPlaceholderName(const QModelIndex &parentIndex); - QString getNewTagPlaceholderName(); - QVector getSeparatorIndex(); - QModelIndex getDefaultNotesIndex(); - QModelIndex getAllNotesButtonIndex(); - QModelIndex getTrashButtonIndex(); - void deleteRow(const QModelIndex &rowIndex, const QModelIndex &parentIndex); + void + appendChildNodeToParent(const QModelIndex &parentIndex, + const QHash &data); // 向父节点添加子节点 + QModelIndex rootIndex() const; // 获取根节点索引 + QModelIndex folderIndexFromIdPath(const NodePath &idPath); // 根据ID路径获取文件夹索引 + QModelIndex tagIndexFromId(int id); // 根据ID获取标签索引 + QString getNewFolderPlaceholderName(const QModelIndex &parentIndex); // 获取新文件夹占位符名称 + QString getNewTagPlaceholderName(); // 获取新标签占位符名称 + QVector 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 &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 &ids); // 标签拖放成功信号 + void requestMoveFolderToTrash(const QModelIndex &index); // 请求移动文件夹到垃圾桶信号 private: - NodeTreeItem *rootItem; - void loadNodeTree(const QVector &nodeData, NodeTreeItem *rootNode); - void appendAllNotesAndTrashButton(NodeTreeItem *rootNode); - void appendFolderSeparator(NodeTreeItem *rootNode); - void appendTagsSeparator(NodeTreeItem *rootNode); - void loadTagList(const QVector &tagData, NodeTreeItem *rootNode); - void updateChildRelativePosition(NodeTreeItem *parent, const NodeItem::Type type); + NodeTreeItem *rootItem; // 根节点 + void loadNodeTree(const QVector &nodeData, NodeTreeItem *rootNode); // 加载节点树 + void appendAllNotesAndTrashButton(NodeTreeItem *rootNode); // 添加所有笔记和垃圾桶按钮 + void appendFolderSeparator(NodeTreeItem *rootNode); // 添加文件夹分隔符 + void appendTagsSeparator(NodeTreeItem *rootNode); // 添加标签分隔符 + void loadTagList(const QVector &tagData, NodeTreeItem *rootNode); // 加载标签列表 + void updateChildRelativePosition(NodeTreeItem *parent, + const NodeItem::Type type); // 更新子节点相对位置 }; #endif // NODETREEMODEL_H diff --git a/source/src/nodetreeview.cpp b/source/src/nodetreeview.cpp index a155816..bc407ed 100644 --- a/source/src/nodetreeview.cpp +++ b/source/src/nodetreeview.cpp @@ -10,59 +10,60 @@ #include #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(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( @@ -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(model()); @@ -131,7 +132,7 @@ void NodeTreeView::onFolderDropSuccessful(const QString &path) setCurrentIndexC(m_model->getAllNotesButtonIndex()); } } - +// 标签拖放成功时的处理 void NodeTreeView::onTagsDropSuccessful(const QSet &ids) { auto m_model = dynamic_cast(model()); @@ -151,18 +152,18 @@ void NodeTreeView::onTagsDropSuccessful(const QSet &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( 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(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 ¤t, const QModelIndex &previous) +void NodeTreeView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)// 当前索引发生变化时的处理 { QTreeView::currentChanged(current, previous); auto itemType = static_cast(current.data(NodeItem::Roles::ItemType).toInt()); @@ -302,7 +303,7 @@ void NodeTreeView::currentChanged(const QModelIndex ¤t, 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( @@ -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( @@ -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 &newTreeSeparator, +void NodeTreeView::setTreeSeparator(const QVector &newTreeSeparator,// 设置树分隔符 const QModelIndex &defaultNotesIndex) { for (const auto &sep : qAsConst(m_treeSeparator)) { @@ -484,7 +485,7 @@ void NodeTreeView::setTreeSeparator(const QVector &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);