跳到正文
Yayin Story Studio Yayin Story Studio 项目文档

Visindigo::Widgets::Terminal Class

class Visindigo::Widgets::Terminal

一个内置终端窗口,可以显示日志输出并接受用户输入的命令. 详情...

头文件: #include <Terminal>
自以下版本: Visindigo 0.13.0

公开类型

(自 Visindigo 0.16.0 引入) enum WorkMode { PureText, VirtualTerminal }

公开成员函数

(自 Visindigo 0.13.0 引入) Terminal(QWidget *parent = nullptr)
(自 Visindigo 0.13.0 引入) ~Terminal()
(自 Visindigo 0.16.0 引入) void addLine(const QString &line, bool forceFlush = false)
(自 Visindigo 0.16.0 引入) void bindQProcess(QProcess *proc)
(自 Visindigo 0.13.0 引入) void clearConsole()
(自 Visindigo 0.13.0 引入) QStringList getCommandHistory() const
(自 Visindigo 0.16.0 引入) QProcess *getExternalProcess() const
(自 Visindigo 0.13.0 引入) qint32 getMaxCommandHistory() const
(自 Visindigo 0.13.0 引入) qint32 getMaxLines() const
(自 Visindigo 0.16.0 引入) Visindigo::Widgets::Terminal::WorkMode getWorkMode() const
(自 Visindigo 0.16.0 引入) void input(const QString &line)
(自 Visindigo 0.13.0 引入) bool isAutoScroll() const
(自 Visindigo 0.16.0 引入) bool isExternalProcessRunning() const
(自 Visindigo 0.16.0 引入) bool isExternalProcessUTF8() const
(自 Visindigo 0.13.0 引入) bool isInputEnabled() const
(自 Visindigo 0.16.0 引入) void launchExternalProcess(const QString &systemCommand, const QStringList &arguments, const QString &workingDirectory = QString())
(自 Visindigo 0.13.0 引入) void setAutoScroll(bool autoScroll)
(自 Visindigo 0.16.0 引入) void setCommandHistory(const QStringList &historyList)
(自 Visindigo 0.16.0 引入) void setExternalProcessUTF8(bool utf8)
(自 Visindigo 0.13.0 引入) void setInputEnable(bool enable)
(自 Visindigo 0.13.0 引入) void setMaxCommandHistory(qint32 historyCount)
(自 Visindigo 0.13.0 引入) void setMaxLines(qint32 lineCount)
(自 Visindigo 0.16.0 引入) void setWorkMode(Visindigo::Widgets::Terminal::WorkMode mode)
(自 Visindigo 0.16.0 引入) void terminateExternalProcess(bool waiting = false)

信号

(自 Visindigo 0.16.0 引入) void externalProcessFinished(int exitCode, int exitStatus)
(自 Visindigo 0.16.0 引入) void inputPrepared(const QString &command)
(自 Visindigo 0.16.0 引入) void stderrReceived(const QString &text)
(自 Visindigo 0.16.0 引入) void stdoutReceived(const QString &text)

静态公开成员

(自 Visindigo 0.16.0 引入) Visindigo::Widgets::Terminal *createPowerShell()

详细说明

Terminal类提供了一个内置的终端窗口,可以显示日志输出并接受用户输入的命令。 用户可以通过按下回车键或点击发送按钮来执行输入的命令。稍后,inputPrepared信号将被触发,携带用户输入的命令文本,供外部处理。

自0.16.0开始,这类自带一个外部进程管理。通过launchExternalProcess方法,用户可以在终端中启动一个外部进程, 并将该进程的标准输出和标准错误输出重定向到终端窗口中显示。同时,用户在终端中输入的命令也会被发送到该外部进程的标准输入。 这使得Terminal类不仅可以作为一个简单的日志窗口,还可以作为一个功能完整的终端模拟器来使用。

理论上,Terminal类还支持命令历史记录,用户可以通过上下箭头键来浏览之前输入的命令。

性能与实时性

Terminal类的设计目标是提供一个功能完善的终端窗口,能够正确处理ANSI控制序列并显示丰富的文本格式。 然而,由于Qt的文本渲染机制和事件处理机制,Terminal类的解析性能相对较差,且只能在事件循环正常 运行时刷新显示内容。这就意味着在主线程的某个循环体内大量输出日志时,实际上并不会有东西显示出来。

Terminal类在早期曾经尝试过允许用户设置缓冲区与内部调用qApp->processEvent以缓解性能问题并 解决实时性,但内部调用processEvent可能会破坏原有的事件循环封装,带来难以预料的问题。因此基于 这种难以达到实时性的考虑,我们退而求其次也取消了缓冲区设计,转为每秒固定尝试刷新显示内容 20次。

这种摆烂设计的一个重要好处是不会破坏事件循环封装,也不会影响循环体的执行性能。如果用户真的 需要在中途刷新显示内容,应当自行尝试使用qApp->processEvent或类似的方式, 但这需要用户自己权衡性能与实时性,并且需要注意可能带来的副作用。

成员类型文档

[since Visindigo 0.16.0] enum Terminal::WorkMode

ConstantValueDescription
Visindigo::Widgets::Terminal::PureText0纯文本模式,终端将不解析任何ANSI控制序列,所有输入都将被视为普通文本直接显示。这种模式适用于只需要简单日志输出而不需要格式控制的场景。
Visindigo::Widgets::Terminal::VirtualTerminal1虚拟终端模式,终端将解析输入中的ANSI控制序列以实现丰富的文本格式和控制效果。这是默认模式,适用于需要完整终端功能的场景。

如果你确定输出的内容不会有任何ANSI序列控制,则PureText模式会有更好的性能表现。 与此同时,PureText下,每次addLine时都直接将文本添加到终端中,而不需要等待定时刷新。

这个enum 从 Visindigo 0.16.0 开始支持。

成员函数文档

[since Visindigo 0.13.0] Terminal::Terminal(QWidget *parent = nullptr)

parent 父组件。

构造函数

这个function 从 Visindigo 0.13.0 开始支持。

[noexcept, since Visindigo 0.13.0] Terminal::~Terminal()

析构函数

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.16.0] void Terminal::addLine(const QString &line, bool forceFlush = false)

line 要添加的行文本。 forceFlush 是否强制刷新显示内容。 向终端添加一行文本。该函数会正确处理ANSI控制序列以实现丰富的文本格式和控制效果。

如果forceFlush参数为true,函数会立即刷新显示内容,否则会等待下一次定时刷新。

请注意,这个forceFlush参数的立即刷新仅仅是将缓冲区中的内容进行解析,但不保证 显示内容也立即更新,因为Qt的显示更新仍然需要等到事件循环处理时才会进行。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.16.0] void Terminal::bindQProcess(QProcess *proc)

proc 要绑定的外部QProcess指针,传入nullptr可解除绑定。

将一个外部的QProcess绑定到此Terminal。与launchExternalProcess不同, bindQProcess不会创建新的QProcess对象,而是直接使用外部已有的QProcess实例。 Terminal不会取得该QProcess的所有权——当Terminal析构时,绑定的外部QProcess 不会被终止或删除,只会断开信号连接并释放引用。

绑定后,Terminal会自动连接该QProcess的readyReadStandardOutput、 readyReadStandardError和finished信号,以将输出重定向到终端显示。 用户在终端中输入的文本也会通过inputPrepared信号发送到该QProcess的标准输入。

如果此前已经有一个通过launchExternalProcess创建的内部QProcess正在运行, 该内部进程会被终止并销毁。如果此前已经绑定了一个外部QProcess,则会先 断开与旧进程的信号连接。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.13.0] void Terminal::clearConsole()

清除终端中的所有内容。

这个function 从 Visindigo 0.13.0 开始支持。

[static, since Visindigo 0.16.0] Visindigo::Widgets::Terminal *Terminal::createPowerShell()

在Windows平台上,创建一个预配置为使用PowerShell的Terminal实例。

它最大的便捷之处在于提前将代码页切换到65001(UTF-8),这样就不需要担心中文乱码问题了。

在其他平台,这返回空指针。

这个function 从 Visindigo 0.16.0 开始支持。

[signal, since Visindigo 0.16.0] void Terminal::externalProcessFinished(int exitCode, int exitStatus)

当通过launchExternalProcess启动的外部进程结束时,externalProcessFinished信号将被触发,携带外部进程的退出代码和退出状态。

参数 exitCode 是外部进程的退出代码,参数 exitStatus 是该进程的退出状态。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.13.0] QStringList Terminal::getCommandHistory() const

return 命令历史记录。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.16.0] QProcess *Terminal::getExternalProcess() const

return 外部进程的QProcess对象,在没有调用过launchExternalProcess的情况下,可能返回nullptr

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.13.0] qint32 Terminal::getMaxCommandHistory() const

return 命令历史记录的最大数量。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] qint32 Terminal::getMaxLines() const

return 终端缓存的最大行数。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.16.0] Visindigo::Widgets::Terminal::WorkMode Terminal::getWorkMode() const

return 终端当前的工作模式。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.16.0] void Terminal::input(const QString &line)

line 要输入的命令文本。

模拟从输入框直接输入命令的效果,基本上等于直接触发inputPrepared信号,但也会将输入的命令添加到命令历史中。 如果输入框中已有内容,它不会干扰已有内容和历史记录的浏览。

这个function 从 Visindigo 0.16.0 开始支持。

[signal, since Visindigo 0.16.0] void Terminal::inputPrepared(const QString &command)

当用户在输入框中输入命令并按下回车键时,inputPrepared信号将被触发,携带用户输入的命令文本,供外部处理。

input函数也会触发此信号。

参数 command 是用户输入的命令文本。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.13.0] bool Terminal::isAutoScroll() const

return 是否启用自动滚动。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.16.0] bool Terminal::isExternalProcessRunning() const

return 外部进程是否正在运行

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.16.0] bool Terminal::isExternalProcessUTF8() const

return 是否以UTF-8编码对待外部进程。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.13.0] bool Terminal::isInputEnabled() const

return 输入框是否启用。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.16.0] void Terminal::launchExternalProcess(const QString &systemCommand, const QStringList &arguments, const QString &workingDirectory = QString())

systemCommand 要执行的系统命令,用于启动外部进程 arguments 外部进程的命令行参数 workingDirectory 外部进程的工作目录,默认为空表示使用当前目录

Terminal使用 systemCommand 启动一个外部进程,并将该进程的标准输出和标准错误输出重定向到终端窗口中显示。 同时,用户在终端中输入的命令也会被发送到该外部进程的标准输入。

请注意,如果已有外部进程在运行,这个函数不做任何事情

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.13.0] void Terminal::setAutoScroll(bool autoScroll)

autoScroll 是否启用自动滚动。

设置是否启用自动滚动。当启用时,终端会在输出新内容时自动滚动到最新行。

目前,只要有新行被添加,就强制滚动到最新。

这个function 从 Visindigo 0.13.0 开始支持。

另请参阅 isAutoScroll().

[since Visindigo 0.16.0] void Terminal::setCommandHistory(const QStringList &historyList)

historyList 命令历史记录列表。

设置命令历史记录列表。这个函数会替换掉原有的命令历史记录,并且会将历史记录数量限制在当前设置的最大数量之内。

结合get函数,你可以有办法持久化存储命令历史记录,例如在程序关闭时保存到文件中,在程序启动时加载回来。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.16.0] void Terminal::setExternalProcessUTF8(bool utf8)

utf8 设置是否以UTF-8编码对待外部进程,默认为true。

设置是否以UTF-8编码对待通过launchExternalProcess启动的外部进程。当设置为true时, 终端会将外部进程的标准输出和标准错误输出视为UTF-8编码的文本进行解析和显示; 并将输入的命令文本以UTF-8编码发送到外部进程的标准输入。

当设置为false时,终端会使用系统默认的本地代码页(所谓Local8Bit)来解析输出并传递输入。

你可以随时更改它,更改立即生效,并且会影响后续的输入输出,但不会影响已经显示的内容。

这个function 从 Visindigo 0.16.0 开始支持。

另请参阅 isExternalProcessUTF8().

[since Visindigo 0.13.0] void Terminal::setInputEnable(bool enable)

enable 是否启用输入框。

设置输入框是否启用。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] void Terminal::setMaxCommandHistory(qint32 historyCount)

historyCount 历史记录的最大数量。

设置命令历史记录的最大数量。当历史记录超过这个数量时,最早的记录将被删除。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] void Terminal::setMaxLines(qint32 lineCount)

lineCount 最大行数。

设置终端缓存的最大行数。当终端中的行数超过这个数量时,最早的行将被删除以保持行数不超过这个限制。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.16.0] void Terminal::setWorkMode(Visindigo::Widgets::Terminal::WorkMode mode)

mode 工作模式。

设置终端的工作模式。不同的工作模式会影响终端如何处理输入的文本以及如何显示内容。

这个function 从 Visindigo 0.16.0 开始支持。

[signal, since Visindigo 0.16.0] void Terminal::stderrReceived(const QString &text)

当通过launchExternalProcess启动的外部进程有新的标准错误输出内容时,stderrReceived信号将被触发,携带新输出的文本内容。

参数 text 是新接收到的标准错误文本。

这个function 从 Visindigo 0.16.0 开始支持。

[signal, since Visindigo 0.16.0] void Terminal::stdoutReceived(const QString &text)

当通过launchExternalProcess启动的外部进程有新的标准输出内容时,stdoutReceived信号将被触发,携带新输出的文本内容。

参数 text 是新接收到的标准输出文本。

这个function 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.16.0] void Terminal::terminateExternalProcess(bool waiting = false)

waiting 是否等待程序终止

终止正在运行的外部进程

这个function 从 Visindigo 0.16.0 开始支持。