Как эффективно создать регистратор столбцов фиксированной ширины, используя QPlaintTextEdit?

Я хочу создать окно журнала в Qt (4.8), используя QPlainTextEdit. Это значит я буду использовать appendPlainText, Этот журнал должен отображать столбцы данных, которые должны иметь фиксированную ширину независимо от отображаемых данных (они будут иметь максимальный размер данных). Я хочу, чтобы они могли показать что-то вроде этого:

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 код:

Результат теста для первого кода

Ссылки: Ссылка 1, Ссылка 2

0 ответов

На pyside2 я использую моноширинный шрифт font-familiy (установлен в qt Designer), а затем
text_row1 = str(col1).ljust(10) + ...

Другие вопросы по тегам