如何使用 QPlaintTextEdit 高效地创建固定宽度的列记录器?

Posted

技术标签:

【中文标题】如何使用 QPlaintTextEdit 高效地创建固定宽度的列记录器?【英文标题】:How to efficiently create a fixed width column logger using QPlaintTextEdit? 【发布时间】:2015-06-12 17:06:50 【问题描述】:

我想使用 QPlainTextEdit 在 Qt (4.8) 中创建一个日志窗口。这意味着我将使用appendPlainText。该日志需要显示需要具有固定宽度的数据列,与显示的数据无关(它们将具有数据的最大大小)。 IOW 我希望他们能够展示这样的内容:

column 1    column 2    column3
data1       data2       data3
   data1      data2     data3
a           b           c

正如您在上面的示例中看到的那样,每列都有固定的宽度,例如,如果某些数据小于可用空间,则下一个数据将从相应列的确切起点开始(而不是紧随其后) )。我需要知道如何在 Qt 中以一种有效的方式做到这一点。

在网上做了一些研究后,我发现我采取的一些方法是不合适的。第一个是使用 QString::args():

ui->plainTextEdit->appendPlainText(QString("%1 %2 %3").arg("123456789",15,' ').arg("123456789",15,' ').arg("123456789",15,' '));
ui->plainTextEdit->appendPlainText(QString("%1 %2 %3").arg("12345",15,' ').arg("123456789",15,' ').arg("123456789",15,' '));
ui->plainTextEdit->appendPlainText(QString("%1 %2 %3").arg("333333333333",-15,' ').arg("12345",-15,' ').arg("12345",-15,' '));
ui->plainTextEdit->appendPlainText(QString("%1 %2 %3").arg("333333333333333",15,' ').arg("333333333333333",15,' ').arg("123456789",15,' '));

上面的代码有一些不足:首先它的默认显示配置是集中数据,除非在告诉列大小的地方设置了“-”。 (文件正式告诉正数给出了一个右对齐的值,但我的测试显示不是这样 - 见下文)不过,这是错误且有限的:我无法做到右对齐,如果我告诉首先arg 具有左对齐文本,然后所有其他args 也显示左对齐文本,即使它们的列宽编号是正数。此外,它仅在字体样式为 Monospace 时才真正起作用。

我发现的另一种方法是使用 QTextStream:

QString s;
QTextStream ss(&s);
ss.setFieldAlignment(QTextStream::AlignLeft);
ss.setFieldWidth(40);

QString s;
QTextStream ss(&s);
ss << left << qSetFieldWidth(40) << "Value" << "Keyword/Constant" << qSetFieldWidth(0) << endl;
ss << qSetFieldWidth(40) << "One" << "One" << qSetFieldWidth(0) << endl;

但这似乎“过于复杂”;我期待一个更像args 的解决方案。

就没有别的办法了吗?

这是我使用args 代码进行的测试:

参考:Link 1、Link 2

【问题讨论】:

感谢分享QTextStream 方法!这对我的用例来说已经足够了。 好Q没有答案 【参考方案1】:

在 pyside2 上,我使用 font-familiy monospace(在 qt 设计器中设置)然后text_row1 = str(col1).ljust(10) + ...

【讨论】:

以上是关于如何使用 QPlaintTextEdit 高效地创建固定宽度的列记录器?的主要内容,如果未能解决你的问题,请参考以下文章

QQ登录界面中的动态背景是如何实现的?

在 Grafana 中将多个数据系列组合为相同的值

在 C# 中使用 CreateDirectory 避免 NotSupportedException

JS关于全局变量的问题

汤姆大叔JavaScript

javascript日常学习小记