Как эффективно создать регистратор столбцов с фиксированной шириной с помощью QPlaintTextEdit?

Я хочу создать окно журнала в Qt (4.8) с помощью QPlainTextEdit. Это означает, что я буду использовать 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);

or

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


person Momergil    schedule 12.06.2015    source источник
comment
Спасибо, что поделились QTextStream подходом! Этого достаточно для моего варианта использования.   -  person Vicky Chijwani    schedule 27.06.2016
comment
хороший вопрос нет ответа   -  person qrtLs    schedule 22.09.2019


Ответы (1)


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

person qrtLs    schedule 22.09.2019