我想使用 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
代码的测试: