我想在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*
,因此我也不能使用任何其他窗口小部件。
答案 0 :(得分:2)
如果使用的字体不是等宽字体,我认为使用“空白”字符的对齐可能会失败。
您应该使用QGridLayout,或者,如果您真的只需要使用一个QLable
将其存档,则可以使用html标签(table
,tr
,{ {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);