Общий код для выравнивания текста непостоянной ширины на QLabel - PullRequest
0 голосов
/ 31 августа 2018

Я хочу выровнять текст следующим образом на QLabel:

name         : value
more         : other value
longer name  : value

Это легко сделать следующим образом

QString str;
str += "name\t\t: value\n";
str += "more\t\t: other value\n"
str += "longer name\t: value"

Вопрос в том, , если я заранее не знаю пар строк, есть ли способ в Qt определить, сколько символов \t должно получить каждая строка, чтобы они совпали с * 1010? * (если вкладки - единственный вариант)?

Я не могу использовать QString :: arg (), так как текст отображается в графическом интерфейсе с использованием текста не-постоянной-ширины. Проблема здесь в том, что если я посчитал количество символов и установил fieldWidth , то : не выравнивается, так как ширина каждого символа не одинакова (изменение шрифта не вариант)

Я попробовал некоторую логику подсчитать, а затем «угадать» количество вкладок, которые нужно вставить, что в целом работает, но в некоторых случаях это может не сработать.

Я также не могу использовать любые другие виджеты, так как код имеет доступ только к одному QLabel*, который он должен обновить.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я думаю, что выравнивание с использованием символов «пробела» может завершиться неудачей, если используемый шрифт не является моноширинным.

Вы должны использовать QGridLayout или, если вам действительно нужно заархивировать это, используя только один QLable, вы можете выровнять текст с помощью HTML-тегов (table, tr, td).

0 голосов
/ 31 августа 2018

Я бы решил эту проблему так, как я опишу ниже. Для простоты я просто распечатываю вывод в требуемом формате, но вы можете изменить функцию самостоятельно, чтобы установить текст метки:

// Prints out the content as an aligned table
static void print(const QList<QPair<QString, QString>> &input)
{
  // Calculate the longest name.
  int longestName = 0;
  for (const auto &i : input) {
    longestName = std::max(longestName, i.first.length());
  }

  // Print out the content.
  for (const auto &i : input) {
    const auto &name = i.first;
    qDebug() << QString("%1%2 : %3")
                        .arg(name)
                        .arg(QString(longestName - name.length(), ' '))
                        .arg(i.second);
  }
}

т.е. вначале я вычисляю длину самого длинного имени и использую эту информацию для выравнивания.

А вот пример использования:

QList<QPair<QString, QString>> input =
{
  { "name", "value" },
  { "more", "other value" },
  { "longer name", "other value" },
};

print(input);
...