在QLabel上对齐非等宽文本的通用代码

时间:2018-08-31 09:52:24

标签: c++ qt c++11 qt5 c++14

我想在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个字符,以便它们对齐:(如果只有标签是唯一的选择)?

我不能使用QString :: arg(),因为文本是使用非恒定宽度文本显示在GUI上的。这里的问题是,如果我计算字符数并设置 fieldWidth ,则:不会对齐,因为每个字符的宽度都不相同(更改字体不是一种选择) )

我尝试了一些逻辑运算,然后“猜测”要插入的选项卡的数量,这种方法通常可以正常工作,但在某些极端情况下可能无法正常工作。

由于代码只能访问必须更新的一个QLabel*,因此我也不能使用任何其他窗口小部件。

2 个答案:

答案 0 :(得分:2)

如果使用的字体不是等宽字体,我认为使用“空白”字符的对齐可能会失败。

您应该使用QGridLayout,或者,如果您真的只需要使用一个QLable将其存档,则可以使用html标签(tabletr,{ {1}}。

答案 1 :(得分:0)

我将按照以下描述的方式解决此问题。为了简单起见,我只是以请求的格式打印输出,但是您可以自行修改函数以设置标签的文本:

// 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);