Yayin Story Studio logo Yayin Story Studio 项目文档
回到主页 用户手册

YSSCore::Editor::FileEditWidget Class

class YSSCore::Editor::FileEditWidget

此类为Yayin Story Studio 提供文件编辑的基类. 详情...

头文件: #include <FileEditWidget>
自以下版本: YSS 0.13.0
被继承:

YSSCore::Editor::TextEdit

公开成员函数

(自 YSS 0.13.0 引入) FileEditWidget(QWidget *parent = nullptr)
(自 YSS 0.13.0 引入) virtual ~FileEditWidget()
(自 YSS 0.13.0 引入) void cancelFileChanged()
(自 YSS 0.13.0 引入) virtual void closeEvent(QCloseEvent *event) override
(自 YSS 0.13.0 引入) void closeFile(bool autoAbandon = false)
(自 YSS 0.13.0 引入) bool copy()
(自 YSS 0.13.0 引入) bool cursorToPosition(qint32 lineNumber, qint32 column)
(自 YSS 0.13.0 引入) bool cut()
(自 YSS 0.15.0 引入) QString getFileExt() const
(自 YSS 0.13.0 引入) QString getFileName() const
(自 YSS 0.13.0 引入) QString getFilePath() const
(自 YSS 0.15.0 引入) QString getVirtualFileParam() const
(自 YSS 0.15.0 引入) bool isAutoAbandon() const
(自 YSS 0.13.0 引入) bool isFileChanged() const
(自 YSS 0.15.0 引入) bool isVirtualFile() const
(自 YSS 0.13.0 引入) bool openFile(const QString &path)
(自 YSS 0.13.0 引入) bool paste()
(自 YSS 0.13.0 引入) bool redo()
(自 YSS 0.13.0 引入) bool reloadFile()
(自 YSS 0.15.0 引入) bool saveFile(const QString &path = "", bool deleteWhenSaveAs = false)
(自 YSS 0.13.0 引入) bool selectAll()
(自 YSS 0.15.0 引入) void setAutoAbandon(bool autoAbandon)
(自 YSS 0.13.0 引入) void setFileChanged()
(自 YSS 0.13.0 引入) bool undo()

信号

(自 YSS 0.14.0 引入) void fileChangeCanceled(const QString &filePath)
(自 YSS 0.13.0 引入) void fileChanged(const QString &filePath)
(自 YSS 0.15.0 引入) void fileClosed(const QString &filePath)
(自 YSS 0.15.0 引入) void fileRenamed(const QString &rawPath, const QString &changedPath)
(自 YSS 0.13.0 引入) void fileSaved(const QString &filePath)

受保护成员函数

(自 YSS 0.13.0 引入) virtual bool onClose()
(自 YSS 0.13.0 引入) virtual bool onCopy()
(自 YSS 0.13.0 引入) virtual bool onCursorToPosition(qint32 lineNumber, qint32 column)
(自 YSS 0.13.0 引入) virtual bool onCut()
(自 YSS 0.13.0 引入) virtual bool onOpen(const QString &path)
(自 YSS 0.13.0 引入) virtual bool onPaste()
(自 YSS 0.13.0 引入) virtual bool onRedo()
(自 YSS 0.13.0 引入) virtual bool onReload()
(自 YSS 0.13.0 引入) virtual bool onSave(const QString &path)
(自 YSS 0.13.0 引入) virtual bool onSelectAll()
(自 YSS 0.13.0 引入) virtual bool onUndo()
(自 YSS 0.15.0 引入) virtual bool onVirtualClose()
(自 YSS 0.15.0 引入) virtual bool onVirtualOpen(const QString &ext, const QString &fileName, const QString &param)
(自 YSS 0.15.0 引入) virtual bool onVirtualReload()
(自 YSS 0.15.0 引入) virtual bool onVirtualSave()

详细说明

FileEditWidget是所有文件编辑器的基类,所有文件编辑器都需要继承此类。

Note: 这类在0.15.0因引入虚拟文件概念而变更了虚函数顺序和声明,因此ABI与此前不同。

文件编辑器的职责

文件编辑器的职责是提供一个界面来编辑文件内容,并提供一些基本的文件操作功能, 如保存、撤销、重做等。具体来说,文件编辑器需要实现以下功能:

  • 1. 打开文件:能够打开一个指定路径的文件,并将其内容显示在编辑器中。
  • 2. 编辑文件:能够修改文件内容,并能够检测到文件内容的修改状态。
  • 3. 保存文件:能够将修改后的文件内容保存到指定路径的文件中。
  • 4. 其他操作:能够提供一些常用的编辑操作,如复制、剪切、粘贴、全选等。

上述未提及的功能,如重载、光标定位等都是可选功能。重载默认按照打开文件的方式重新加载文件内容,光标定位默认不实现。

文件编辑器的使用接口和实现接口

文件编辑器提供了一套使用接口和实现接口。使用接口是指外部代码调用该 文件编辑器时使用的接口,比如openFilesaveFile等; 实现接口是指文件编辑器的子类需要重载的接口,如onOpenonSave等。

目前,所有实现接口都以on开头,且设为protected,理应不被外部调用, 实际上也不应被继承类调用,除非你明确要复用基类的实现逻辑。

虚拟文件

YSSCore提供了一套被称之为虚拟文件的概念。有关该概念的详细阐述, 以及虚拟文件的虚拟文件路径的格式,请参考YSSCore::Editor::FileServer的相关文档。 这里我们只说明一下FileEditWidget在虚拟文件模式下的一些特殊行为。

openFile函数被调用时,如果传入的路径符合虚拟文件路径的格式(即以@开头,且包含!和?), 则FileEditWidget会自动将其识别为虚拟文件,并将isVirtualFile属性设为true。 此时,文件路径、文件名、扩展名等相关信息会按照虚拟文件路径的格式进行解析和返回。

在虚拟文件模式下,有关文件读写操作的四函数从onOpenonCloseonSaveonReload 变更为onVirtualOpenonVirtualCloseonVirtualSaveonVirtualReload,且默认实现为返回false。 但对应的外部使用接口不变,仍然为openFile、close、saveFilereloadFile等。

也就是说,外部调用者无需关心当前文件是否为虚拟文件,仍然按照正常的方式调用这些接口即可, FileEditWidget会根据当前文件的类型自动调用相应的实现接口。不过值得一提的是, 在虚拟文件模式下,saveFile传入的两个参数均会被忽略。

文件关闭的行为

在四大读写操作函数中,只有closeFile()是void类型,这意味着无法通过返回值来判断文件是否成功关闭了。 因为文件的关闭可能并非是从手动调用触发的,也可能是从用户点击关闭按钮触发的,而且也可能因 用户的要求中途取消了关闭操作。因此FileEditWidget通过重载closeEvent函数来统一处理所有 来源的关闭,且不可能从closeFile知道是否成功关闭。要获得文件的关闭状态,应该监听fileClosed信号。

此外,根据目前FileServerManager的实现,fileClosed信号发出之后,在下一个事件循环该 FileEditWidget对象就会被销毁,因此任何连接到fileClosed信号的槽函数都只应做一些立即操作, 并且不得缓存该对象的指针以备后用,因为该对象可能已经被销毁了。

成员函数文档

[since YSS 0.13.0] FileEditWidget::FileEditWidget(QWidget *parent = nullptr)

parent 为父对象。

构造FileEditWidget对象。

这个function 从 YSS 0.13.0 开始支持。

[virtual noexcept, since YSS 0.13.0] FileEditWidget::~FileEditWidget()

析构FileEditWidget对象。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] void FileEditWidget::cancelFileChanged()

将当前文件内容标记为未修改状态。 此函数通常在派生类中被调用,当文件内容被保存或重新加载后,应调用此函数以更新文件状态。 之后,它会自动触发fileChangeCanceled信号,通知外部文件内容修改已被取消,并传递当前文件路径作为参数。

这个function 从 YSS 0.13.0 开始支持。

[override virtual, since YSS 0.13.0] void FileEditWidget::closeEvent(QCloseEvent *event)

event 关闭事件对象。

处理文件编辑器关闭事件。

此函数在文件编辑器尝试关闭时被调用,调用派生类实现的onClose()函数以决定是否允许关闭。 如果onClose()返回true,则接受关闭事件;否则忽略关闭事件,文件编辑器保持打开状态。

Warning: 派生类若重载了closeEvent(),应确保调用基类的实现以保持正确的关闭行为。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] void FileEditWidget::closeFile(bool autoAbandon = false)

关闭当前文件编辑器。autoAbandon 是否自动放弃未保存的修改。默认为false,即不自动放弃。

这个函数直接调用QWidget的close()函数,触发关闭事件。

关闭事件会调用派生类实现的onClose()函数以决定是否允许关闭。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::copy()

复制当前选中的内容到剪贴板。

return 如果复制操作成功,返回true;否则返回false。

此类调用派生类实现的onCopy()函数以实际处理复制逻辑。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::cursorToPosition(qint32 lineNumber, qint32 column)

lineNumber 行号,从1开始。 column 列号,从1开始。

将光标移动到指定的行号和列号位置。

return 如果光标成功移动到指定位置,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::cut()

剪切当前选中的内容到剪贴板。

return 如果剪切操作成功,返回true;否则返回false。

此类调用派生类实现的onCut()函数以实际处理剪切逻辑。

这个function 从 YSS 0.13.0 开始支持。

[signal, since YSS 0.14.0] void FileEditWidget::fileChangeCanceled(const QString &filePath)

filePath 当前文件路径。

当文件内容修改被取消时,自动触发此信号。

这个function 从 YSS 0.14.0 开始支持。

[signal, since YSS 0.13.0] void FileEditWidget::fileChanged(const QString &filePath)

filePath 当前文件路径。

当文件内容被修改时,自动触发此信号。

这个function 从 YSS 0.13.0 开始支持。

另请参阅 setFileChanged().

[signal, since YSS 0.15.0] void FileEditWidget::fileClosed(const QString &filePath)

filePath 当前文件路径。

当文件最终被关闭时,自动触发此信号。

请注意,这函数发出之后,该FileEditWidget很快就会被销毁,且无法阻止。 请勿再保存该对象的指针以备后用。

这个function 从 YSS 0.15.0 开始支持。

[signal, since YSS 0.15.0] void FileEditWidget::fileRenamed(const QString &rawPath, const QString &changedPath)

rawPath 原文件路径。 changedPath 现文件路径。

当文件被成功保存,且路径与此前不一致时,自动触发此信号。

这个function 从 YSS 0.15.0 开始支持。

[signal, since YSS 0.13.0] void FileEditWidget::fileSaved(const QString &filePath)

filePath 当前文件路径。

当文件被成功保存时,自动触发此信号。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.15.0] QString FileEditWidget::getFileExt() const

return 当前文件的扩展名。

返回当前文件的扩展名(不带点)。如果当前没有打开任何文件,则返回空字符串。

对于虚拟文件路径,扩展名是路径中@和!之间的部分。

这个function 从 YSS 0.15.0 开始支持。

[since YSS 0.13.0] QString FileEditWidget::getFileName() const

return 当前文件编辑器的文件名。

返回当前文件编辑器的文件名。如果当前没有打开任何文件,则返回空字符串。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] QString FileEditWidget::getFilePath() const

return 当前文件编辑器的文件路径。

返回当前文件编辑器的文件路径。如果当前没有打开任何文件,则返回空字符串。

注意,这可能是个虚拟文件路径,如果当前文件是通过FileServer打开的虚拟文件, 则返回的路径格式为@ext!fileName?param,其中ext是文件扩展名,fileName是文件名,param是额外参数。 对于虚拟文件路径,getFileName()函数会正确解析并返回文件名部分。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.15.0] QString FileEditWidget::getVirtualFileParam() const

return 当前虚拟文件的参数部分。

返回当前虚拟文件的参数部分。如果当前文件不是虚拟文件或没有参数,则返回空字符串。

对于虚拟文件路径,参数部分是路径中?之后的部分。

这个function 从 YSS 0.15.0 开始支持。

[since YSS 0.15.0] bool FileEditWidget::isAutoAbandon() const

return 当前文件编辑器的自动放弃状态。

如果在关闭文件时会自动放弃未保存的修改,返回true;否则返回false。

这个function 从 YSS 0.15.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::isFileChanged() const

return 当前文件内容是否被修改。

如果文件内容被修改,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.15.0] bool FileEditWidget::isVirtualFile() const

return 当前文件是否为虚拟文件。

如果当前文件为虚拟文件,返回true;否则返回false。

虚拟文件是指不对应实际磁盘文件的文件,通常由程序动态生成或从其他来源加载。对于虚拟文件,某些操作可能会有所不同,例如保存时可能需要特殊处理。

这个function 从 YSS 0.15.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onClose()

派生类可以实现此虚函数以处理文件关闭逻辑。

return 如果文件编辑器可以关闭,返回true;否则返回false。

这个函数默认会根据isFileChanged()的返回值来判断文件是否被修改过, 如果被修改过则弹出一个警告对话框询问用户是否保存修改。这应该可以 满足绝大部分情况下的关闭需求,因此如果没有特殊需求,派生类无需重载此函数。

如果isAutoAbandon()返回true,则无论文件是否被修改过,都会直接放弃修改并允许关闭。

Warning: 不要在这个函数里调用close或deleteLater等任何实质上真的 会关闭这个Widget的函数,会造成递归爆栈。这个函数的唯一作用是通过 return 告知YSS是否真的应该关闭它。因此你可以在里面做一些保存、警告等操作

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onCopy()

派生类实现此纯虚函数以处理复制逻辑。

return 如果复制操作成功,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onCursorToPosition(qint32 lineNumber, qint32 column)

lineNumber 行号,从1开始。 column 列号,从1开始。

由派生类实现的函数,用于将光标移动到指定的行号和列号位置。

由于FileEditWidget最早是面向文本文件设计,因此 lineNumbercolumn 的语义是基于文本文件的行列号的。但如有需要, 也可以将其按照其他方式进行解释和使用,例如对于图片,可用理解为像素坐标等。

return 如果光标成功移动到指定位置,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onCut()

派生类实现此纯虚函数以处理剪切逻辑。

return 如果剪切操作成功,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onOpen(const QString &path)

派生类必须实现此纯虚函数以处理文件打开逻辑。 path 要打开的文件路径。

return 如果文件成功打开并加载,返回true;否则返回false。

Warning: 从0.15开始,这个函数可能因为onReload而重复调用,不保证 在整个生命周期内只调用一次。因此如果你在这个函数内尝试懒加载你的 FileEditWidget,应当首先检查资源是否已经初始化,避免出现内存泄漏。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onPaste()

派生类实现此纯虚函数以处理粘贴逻辑。

return 如果粘贴操作成功,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onRedo()

派生类实现此纯虚函数以处理重做逻辑。

return 如果重做操作成功,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onReload()

派生类实现此纯虚函数以处理文件重新加载逻辑。

return 如果文件成功重新加载,返回true;否则返回false。

在0.15之前的版本,这个函数默认返回false 从0.15开始,这个函数默认使用现在的文件路径重新调用onOpen()

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onSave(const QString &path)

派生类必须实现此纯虚函数以处理文件保存逻辑。

path 要保存的文件路径。如果为空字符串,则使用当前文件路径。非空字符串在保存成功后会更新当前文件路径。

return 如果文件成功保存,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onSelectAll()

派生类实现此纯虚函数以处理全选逻辑。

return 如果全选操作成功,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.13.0] bool FileEditWidget::onUndo()

派生类实现此纯虚函数以处理撤销逻辑。

return 如果撤销操作成功,返回true;否则返回false。

这个function 从 YSS 0.13.0 开始支持。

[virtual protected, since YSS 0.15.0] bool FileEditWidget::onVirtualClose()

处理虚拟文件的关闭逻辑。

return 如果虚拟文件编辑器可以关闭,返回true;否则返回false。

默认返回true。

这个function 从 YSS 0.15.0 开始支持。

[virtual protected, since YSS 0.15.0] bool FileEditWidget::onVirtualOpen(const QString &ext, const QString &fileName, const QString &param)

ext 虚拟文件的扩展名。 fileName 虚拟文件的文件名。 param 其他参数字符串,可以包含任意内容,由调用者和实现者自行约定格式和含义。

处理虚拟文件的打开逻辑。

return 如果虚拟文件成功打开,返回true;否则返回false。

默认返回false。

这个function 从 YSS 0.15.0 开始支持。

[virtual protected, since YSS 0.15.0] bool FileEditWidget::onVirtualReload()

处理虚拟文件的重新加载逻辑。

return 如果虚拟文件成功重新加载,返回true;否则返回false。

这个实现默认重新调用onVirtualOpen

这个function 从 YSS 0.15.0 开始支持。

[virtual protected, since YSS 0.15.0] bool FileEditWidget::onVirtualSave()

处理虚拟文件的保存逻辑。

return 如果虚拟文件成功保存,返回true;否则返回false。

默认实现为返回false,表示虚拟文件不支持保存操作。派生类可以根据需要重载此函数以提供虚拟文件的保存功能。

这个function 从 YSS 0.15.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::openFile(const QString &path)

打开指定路径的文件,并加载其内容。 path 要打开的文件路径。

return 如果文件成功打开并加载,返回true;否则返回false。

此类在判定文件路径是否为空后,调用派生类实现的onOpen()函数以实际打开文件。

从0.15.0开始,这个函数会事先判定文件路径是否满足虚拟文件路径,如果是的话,则调用 onVirtualOpen()函数打开。有关虚拟文件路径的概念,请参考FileServer类的说明。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::paste()

从剪贴板粘贴内容到当前光标位置。

return 如果粘贴操作成功,返回true;否则返回false。

此类调用派生类实现的onPaste()函数以实际处理粘贴逻辑。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::redo()

重做上一次被撤销的编辑操作。

return 如果重做操作成功,返回true;否则返回false。

此类调用派生类实现的onRedo()函数以实际处理重做逻辑。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::reloadFile()

重新加载当前文件编辑器的内容。

return 如果文件成功重新加载,返回true;否则返回false。

此类在判定当前文件路径是否为空后,调用派生类实现的onReload()函数以实际重新加载文件。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.15.0] bool FileEditWidget::saveFile(const QString &path = "", bool deleteWhenSaveAs = false)

保存当前文件编辑器的内容到指定路径。 path 要保存的文件路径。如果为空字符串,则使用当前文件路径。非空字符串在保存成功后会更新当前文件路径。 deleteWhenSaveAs 当执行另存为操作时,是否删除原文件。默认为false,即不删除原文件。如果设置为true, 可以视作重命名文件,保存成功后原文件将被删除。请谨慎使用此选项,以免误删重要文件。

return 如果文件成功保存,返回true;否则返回false。

此类在判定文件路径是否为空后,调用派生类实现的onSave()函数以实际保存文件。 一旦文件成功保存,fileChanged状态会被重置为false,并触发fileSaved信号。

Note: 这个函数最初从0.13.0引入,在0.15.0中增加了deleteWhenSaveAs参数以支持在另存为操作时删除原文件的功能。 此外,从0.15.0开始,这个函数会在调用虚函数onSave之后,额外检查文件是否确实存在,以确保保存操作的成功性。 这是因为某些派生类的onSave实现可能会在保存失败时没有正确返回false,因此增加了文件存在性的检查以提高函数的可靠性。

在虚拟文件模式下,它会直接调用onVirtualSave()函数进行保存。虚拟保存时,pathdeleteWhenSaveAs 均无效。

这个function 从 YSS 0.15.0 开始支持。

[since YSS 0.13.0] bool FileEditWidget::selectAll()

选中当前文件编辑器中的所有内容。

return 如果全选操作成功,返回true;否则返回false。

此类调用派生类实现的onSelectAll()函数以实际处理全选逻辑。

这个function 从 YSS 0.13.0 开始支持。

[since YSS 0.15.0] void FileEditWidget::setAutoAbandon(bool autoAbandon)

设置当前文件编辑器的自动放弃状态。 autoAbandon 是否在关闭文件时自动放弃未保存的修改。默认为false,即不自动放弃。

这个function 从 YSS 0.15.0 开始支持。

另请参阅 isAutoAbandon().

[since YSS 0.13.0] void FileEditWidget::setFileChanged()

将当前文件内容标记为已修改状态。 此函数通常在派生类中被调用,当用户修改了文件内容时,应调用此函数以更新文件状态。 之后,它会自动触发fileChanged信号,通知外部文件内容已被修改,并传递当前文件路径作为参数。

这个function 从 YSS 0.13.0 开始支持。

另请参阅 fileChanged().

[since YSS 0.13.0] bool FileEditWidget::undo()

撤销上一次编辑操作。

return 如果撤销操作成功,返回true;否则返回false。

此类调用派生类实现的onUndo()函数以实际处理撤销逻辑。

这个function 从 YSS 0.13.0 开始支持。