如何使用 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 高效地创建固定宽度的列记录器?的主要内容,如果未能解决你的问题,请参考以下文章