- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在文本中有一个转义序列,比如
char const * text = "\e[1;33m" "some colored text" "\e[0m";
通常在终端打印。但我想在 QTextEdit 中转发此文本。
在 QTextEdit 中使此类文本着色的最简单方法是什么?如何执行转义序列过滤,即如何将其替换为正确的文本格式?
我认为可能有 QSyntaxHighlighter 辅助解决方案,但我不知道如何处理转义序列本身以及如何将它们隐藏在输出中。
最佳答案
最后,我找到了方法(据了解,QTextEdit::setReadOnly(true)
):
// based on information: http://en.m.wikipedia.org/wiki/ANSI_escape_code http://misc.flogisoft.com/bash/tip_colors_and_formatting http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
void MainWindow::parseEscapeSequence(int attribute, QListIterator< QString > & i, QTextCharFormat & textCharFormat, QTextCharFormat const & defaultTextCharFormat)
{
switch (attribute) {
case 0 : { // Normal/Default (reset all attributes)
textCharFormat = defaultTextCharFormat;
break;
}
case 1 : { // Bold/Bright (bold or increased intensity)
textCharFormat.setFontWeight(QFont::Bold);
break;
}
case 2 : { // Dim/Faint (decreased intensity)
textCharFormat.setFontWeight(QFont::Light);
break;
}
case 3 : { // Italicized (italic on)
textCharFormat.setFontItalic(true);
break;
}
case 4 : { // Underscore (single underlined)
textCharFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline);
textCharFormat.setFontUnderline(true);
break;
}
case 5 : { // Blink (slow, appears as Bold)
textCharFormat.setFontWeight(QFont::Bold);
break;
}
case 6 : { // Blink (rapid, appears as very Bold)
textCharFormat.setFontWeight(QFont::Black);
break;
}
case 7 : { // Reverse/Inverse (swap foreground and background)
QBrush foregroundBrush = textCharFormat.foreground();
textCharFormat.setForeground(textCharFormat.background());
textCharFormat.setBackground(foregroundBrush);
break;
}
case 8 : { // Concealed/Hidden/Invisible (usefull for passwords)
textCharFormat.setForeground(textCharFormat.background());
break;
}
case 9 : { // Crossed-out characters
textCharFormat.setFontStrikeOut(true);
break;
}
case 10 : { // Primary (default) font
textCharFormat.setFont(defaultTextCharFormat.font());
break;
}
case 11 ... 19 : {
QFontDatabase fontDatabase;
QString fontFamily = textCharFormat.fontFamily();
QStringList fontStyles = fontDatabase.styles(fontFamily);
int fontStyleIndex = attribute - 11;
if (fontStyleIndex < fontStyles.length()) {
textCharFormat.setFont(fontDatabase.font(fontFamily, fontStyles.at(fontStyleIndex), textCharFormat.font().pointSize()));
}
break;
}
case 20 : { // Fraktur (unsupported)
break;
}
case 21 : { // Set Bold off
textCharFormat.setFontWeight(QFont::Normal);
break;
}
case 22 : { // Set Dim off
textCharFormat.setFontWeight(QFont::Normal);
break;
}
case 23 : { // Unset italic and unset fraktur
textCharFormat.setFontItalic(false);
break;
}
case 24 : { // Unset underlining
textCharFormat.setUnderlineStyle(QTextCharFormat::NoUnderline);
textCharFormat.setFontUnderline(false);
break;
}
case 25 : { // Unset Blink/Bold
textCharFormat.setFontWeight(QFont::Normal);
break;
}
case 26 : { // Reserved
break;
}
case 27 : { // Positive (non-inverted)
QBrush backgroundBrush = textCharFormat.background();
textCharFormat.setBackground(textCharFormat.foreground());
textCharFormat.setForeground(backgroundBrush);
break;
}
case 28 : {
textCharFormat.setForeground(defaultTextCharFormat.foreground());
textCharFormat.setBackground(defaultTextCharFormat.background());
break;
}
case 29 : {
textCharFormat.setUnderlineStyle(QTextCharFormat::NoUnderline);
textCharFormat.setFontUnderline(false);
break;
}
case 30 ... 37 : {
int colorIndex = attribute - 30;
QColor color;
if (QFont::Normal < textCharFormat.fontWeight()) {
switch (colorIndex) {
case 0 : {
color = Qt::darkGray;
break;
}
case 1 : {
color = Qt::red;
break;
}
case 2 : {
color = Qt::green;
break;
}
case 3 : {
color = Qt::yellow;
break;
}
case 4 : {
color = Qt::blue;
break;
}
case 5 : {
color = Qt::magenta;
break;
}
case 6 : {
color = Qt::cyan;
break;
}
case 7 : {
color = Qt::white;
break;
}
default : {
Q_ASSERT(false);
}
}
} else {
switch (colorIndex) {
case 0 : {
color = Qt::black;
break;
}
case 1 : {
color = Qt::darkRed;
break;
}
case 2 : {
color = Qt::darkGreen;
break;
}
case 3 : {
color = Qt::darkYellow;
break;
}
case 4 : {
color = Qt::darkBlue;
break;
}
case 5 : {
color = Qt::darkMagenta;
break;
}
case 6 : {
color = Qt::darkCyan;
break;
}
case 7 : {
color = Qt::lightGray;
break;
}
default : {
Q_ASSERT(false);
}
}
}
textCharFormat.setForeground(color);
break;
}
case 38 : {
if (i.hasNext()) {
bool ok = false;
int selector = i.next().toInt(&ok);
Q_ASSERT(ok);
QColor color;
switch (selector) {
case 2 : {
if (!i.hasNext()) {
break;
}
int red = i.next().toInt(&ok);
Q_ASSERT(ok);
if (!i.hasNext()) {
break;
}
int green = i.next().toInt(&ok);
Q_ASSERT(ok);
if (!i.hasNext()) {
break;
}
int blue = i.next().toInt(&ok);
Q_ASSERT(ok);
color.setRgb(red, green, blue);
break;
}
case 5 : {
if (!i.hasNext()) {
break;
}
int index = i.next().toInt(&ok);
Q_ASSERT(ok);
switch (index) {
case 0x00 ... 0x07 : { // 0x00-0x07: standard colors (as in ESC [ 30..37 m)
return parseEscapeSequence(index - 0x00 + 30, i, textCharFormat, defaultTextCharFormat);
}
case 0x08 ... 0x0F : { // 0x08-0x0F: high intensity colors (as in ESC [ 90..97 m)
return parseEscapeSequence(index - 0x08 + 90, i, textCharFormat, defaultTextCharFormat);
}
case 0x10 ... 0xE7 : { // 0x10-0xE7: 6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
index -= 0x10;
int red = index % 6;
index /= 6;
int green = index % 6;
index /= 6;
int blue = index % 6;
index /= 6;
Q_ASSERT(index == 0);
color.setRgb(red, green, blue);
break;
}
case 0xE8 ... 0xFF : { // 0xE8-0xFF: grayscale from black to white in 24 steps
qreal intensity = qreal(index - 0xE8) / (0xFF - 0xE8);
color.setRgbF(intensity, intensity, intensity);
break;
}
}
textCharFormat.setForeground(color);
break;
}
default : {
break;
}
}
}
break;
}
case 39 : {
textCharFormat.setForeground(defaultTextCharFormat.foreground());
break;
}
case 40 ... 47 : {
int colorIndex = attribute - 40;
QColor color;
switch (colorIndex) {
case 0 : {
color = Qt::darkGray;
break;
}
case 1 : {
color = Qt::red;
break;
}
case 2 : {
color = Qt::green;
break;
}
case 3 : {
color = Qt::yellow;
break;
}
case 4 : {
color = Qt::blue;
break;
}
case 5 : {
color = Qt::magenta;
break;
}
case 6 : {
color = Qt::cyan;
break;
}
case 7 : {
color = Qt::white;
break;
}
default : {
Q_ASSERT(false);
}
}
textCharFormat.setBackground(color);
break;
}
case 48 : {
if (i.hasNext()) {
bool ok = false;
int selector = i.next().toInt(&ok);
Q_ASSERT(ok);
QColor color;
switch (selector) {
case 2 : {
if (!i.hasNext()) {
break;
}
int red = i.next().toInt(&ok);
Q_ASSERT(ok);
if (!i.hasNext()) {
break;
}
int green = i.next().toInt(&ok);
Q_ASSERT(ok);
if (!i.hasNext()) {
break;
}
int blue = i.next().toInt(&ok);
Q_ASSERT(ok);
color.setRgb(red, green, blue);
break;
}
case 5 : {
if (!i.hasNext()) {
break;
}
int index = i.next().toInt(&ok);
Q_ASSERT(ok);
switch (index) {
case 0x00 ... 0x07 : { // 0x00-0x07: standard colors (as in ESC [ 40..47 m)
return parseEscapeSequence(index - 0x00 + 40, i, textCharFormat, defaultTextCharFormat);
}
case 0x08 ... 0x0F : { // 0x08-0x0F: high intensity colors (as in ESC [ 100..107 m)
return parseEscapeSequence(index - 0x08 + 100, i, textCharFormat, defaultTextCharFormat);
}
case 0x10 ... 0xE7 : { // 0x10-0xE7: 6*6*6=216 colors: 16 + 36*r + 6*g + b (0≤r,g,b≤5)
index -= 0x10;
int red = index % 6;
index /= 6;
int green = index % 6;
index /= 6;
int blue = index % 6;
index /= 6;
Q_ASSERT(index == 0);
color.setRgb(red, green, blue);
break;
}
case 0xE8 ... 0xFF : { // 0xE8-0xFF: grayscale from black to white in 24 steps
qreal intensity = qreal(index - 0xE8) / (0xFF - 0xE8);
color.setRgbF(intensity, intensity, intensity);
break;
}
}
textCharFormat.setBackground(color);
break;
}
default : {
break;
}
}
}
break;
}
case 49 : {
textCharFormat.setBackground(defaultTextCharFormat.background());
break;
}
case 90 ... 97 : {
int colorIndex = attribute - 90;
QColor color;
switch (colorIndex) {
case 0 : {
color = Qt::darkGray;
break;
}
case 1 : {
color = Qt::red;
break;
}
case 2 : {
color = Qt::green;
break;
}
case 3 : {
color = Qt::yellow;
break;
}
case 4 : {
color = Qt::blue;
break;
}
case 5 : {
color = Qt::magenta;
break;
}
case 6 : {
color = Qt::cyan;
break;
}
case 7 : {
color = Qt::white;
break;
}
default : {
Q_ASSERT(false);
}
}
color.setRedF(color.redF() * 0.8);
color.setGreenF(color.greenF() * 0.8);
color.setBlueF(color.blueF() * 0.8);
textCharFormat.setForeground(color);
break;
}
case 100 ... 107 : {
int colorIndex = attribute - 100;
QColor color;
switch (colorIndex) {
case 0 : {
color = Qt::darkGray;
break;
}
case 1 : {
color = Qt::red;
break;
}
case 2 : {
color = Qt::green;
break;
}
case 3 : {
color = Qt::yellow;
break;
}
case 4 : {
color = Qt::blue;
break;
}
case 5 : {
color = Qt::magenta;
break;
}
case 6 : {
color = Qt::cyan;
break;
}
case 7 : {
color = Qt::white;
break;
}
default : {
Q_ASSERT(false);
}
}
color.setRedF(color.redF() * 0.8);
color.setGreenF(color.greenF() * 0.8);
color.setBlueF(color.blueF() * 0.8);
textCharFormat.setBackground(color);
break;
}
default : {
break;
}
}
}
void MainWindow::setTextTermFormatting(QTextEdit * textEdit, QString const & text)
{
QTextDocument * document = textEdit->document();
QRegExp const escapeSequenceExpression(R"(\x1B\[([\d;]+)m)");
QTextCursor cursor(document);
QTextCharFormat const defaultTextCharFormat = cursor.charFormat();
cursor.beginEditBlock();
int offset = escapeSequenceExpression.indexIn(text);
cursor.insertText(text.mid(0, offset));
QTextCharFormat textCharFormat = defaultTextCharFormat;
while (!(offset < 0)) {
int previousOffset = offset + escapeSequenceExpression.matchedLength();
QStringList capturedTexts = escapeSequenceExpression.capturedTexts().back().split(';');
QListIterator< QString > i(capturedTexts);
while (i.hasNext()) {
bool ok = false;
int attribute = i.next().toInt(&ok);
Q_ASSERT(ok);
parseEscapeSequence(attribute, i, textCharFormat, defaultTextCharFormat);
}
offset = escapeSequenceExpression.indexIn(text, previousOffset);
if (offset < 0) {
cursor.insertText(text.mid(previousOffset), textCharFormat);
} else {
cursor.insertText(text.mid(previousOffset, offset - previousOffset), textCharFormat);
}
}
cursor.setCharFormat(defaultTextCharFormat);
cursor.endEditBlock();
//cursor.movePosition(QTextCursor::Start);
textEdit->setTextCursor(cursor);
}
目前还没有完全测试,但相当可行。这正是我想要的。
关于QTextEdit 和类似 bash 的彩色输出仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38147800/
我用 IntelliJ IDEA 2021.1 CE 在 流行!_OS 20.04 与 bash 5.0.17 . 问题造句:我将IntelliJ终端设置为/bin/bash通过 IntelliJ 设
给定如下命令: bash --shortcuts 我想显示一个快捷方式列表,就像在这个页面上一样: http://www.skorks.com/2009/09/bash-shortcuts-for-m
我有一个脚本可以操作数据、创建参数并将它们发送到第二个脚本。其中一个参数包含一个空格。 脚本1.sh: args=() args+=("A") args+=("1 2") args+=("B") .
我的脚本的“只运行一次”版本的一个非常简单的示例: ./myscript.sh var1 "var2 with spaces" var3 #!/bin/bash echo $1 #output: va
我想了解数字( double )在 bash 中是如何表示的,以及当我在 bash 中以十六进制格式打印数字时会发生什么。 根据 IEEE 754 标准,double 应由 64 位表示:52 位(1
我试图在 bash -c "..." 命令中获取 bash 脚本,但它不起作用。 如果我在 bash -c "..." 之外运行命令,它会起作用。 我需要使用 bash -c "..." 因为我想确保
如何检测我的 bash shell 中是否加载了 bash 补全包?从 bash-completion 的 2.1 版(包含在 Debian 8 中)开始,除了 BASH_COMPLETION_COM
我的 bash_profile 中有一个投影函数。现在我试图从 bash 脚本中调用这个函数,但是我得到了一个未找到的错误。如何使投影函数对 bash 脚本可见? 最佳答案 必须导出函数 export
我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将它们全部传递给程序 (/bin/some_program)。从 bash 脚本调用的登录 shell 将取
当我创建一个新的 bash 进程时,提示符默认为一个非常简单的提示符。我知道我可以编辑 .bashrc 等来更改它,但是有没有办法使用 bash 命令传递提示? 谢谢! 最佳答案 提示由 PS1、PS
好的,我希望这个问题有一定道理,但是 bash shell 和 bash 终端之间有什么区别?例子。当我第一次打开终端时,会提示我当前的目录和用户名。在终端窗口标题中显示 -bash- ,当我键入 e
我是 SBCL 的新手,我正在尝试从 bash 终端运行存储在文本文件中的 Lisp 脚本。 这是我在文件开头写的内容 http://www.sbcl.org/manual/#Running-from
我知道我们可以在 bash 中使用将十六进制转换为十进制 #!/bin/bash echo "Type a hex number" read hexNum echo $(( 16#$hexNum ))
我正在尝试在 bash 脚本中自动完成文件夹名称。如果我输入完整的文件夹名称,一切正常,但我不知道如何自动完成名称。有什么想法吗? repo() { cd ~/Desktop/_REPOS/$1 }
我想检查远程网站上的一些文件。 这里是bash命令生成计算文件md5的命令 [root]# head -n 3 zrcpathAll | awk '{print $3}' | xargs -I {}
是否有任何内置函数可以使用 bash shell 脚本从给定日期获取下周日(下周一、下周二等)?例如,2014 年 9 月 1 日之后的第一个星期日是什么时候?我预计 2014 年 9 月 7 日。
我一直在尝试根据表格重命名一些特定文件,但没有成功。它要么重命名所有文件,要么给出错误。 该目录包含数百个以长条形码命名的文件,我只想重命名包含模式 _1_ 的文件。 例子 barcode_1_bar
bash 中有没有办法用变量的内容替换文本文件中的占位符? 例如,我想发送一封电子邮件通知,如下所示: Dear Foo, Alert: blah blah blah blah blah blah
我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。 这是一些示例输出: mv: cannot move â/tmp/myapp.zipâ
这个问题在这里已经有了答案: How do I place stdout on edit line? (1 个回答) Can a bash script prepopulate the prompt
我是一名优秀的程序员,十分优秀!