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
| Constant | Value | Description |
|---|---|---|
Visindigo::Widgets::Terminal::PureText | 0 | 纯文本模式,终端将不解析任何ANSI控制序列,所有输入都将被视为普通文本直接显示。这种模式适用于只需要简单日志输出而不需要格式控制的场景。 |
Visindigo::Widgets::Terminal::VirtualTerminal | 1 | 虚拟终端模式,终端将解析输入中的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 开始支持。