与QLabel和QLineEdit中的右侧文本对齐

mim*_*imo 4 c++ qt qlayout

我有一个QLabel正好在下面的a QLineEdit具有相同的大小和对齐属性:

QLineEdit *lineEdit = new QLineEdit("999");
lineEdit->setFixedWidth(100);
lineEdit->setAlignment(Qt::AlignRight);
//
QLabel *label = new QLabel("999");
label->setFixedWidth(100);
label->setAlignment(Qt::AlignRight);
//
QLayout *layout = new QVBoxLayout;
layout->addWidget(lineEdit);
layout->addWidget(label);
Run Code Online (Sandbox Code Playgroud)

以下是渲染方式:

在此输入图像描述

如何让底部的文本与文本label完全正确对齐lineEdit

全额奖励,如果你发现在所有平台上工作,而且也适用时的字体大小都在不同的解决方案lineEditlabel.

dte*_*ech 6

不幸的是,它可能是不可能的,至少没有开箱即用,右边距将不起作用,因为即使文本显然向左偏移,它始终为0.原因是这个偏移不是由边距决定的,而是取决于平台GUI风格和正在使用的特定字体的指标的组合,并且它的值"方便"在类公共接口中不可用,没有办法得到它.

您可以轻松获取字体指标,但QStyleOptionFrame由于所需的方法受到保护,您无法获取,访问它将需要子类QLineEdit.但是,如果你很幸运,那个值很可能为零,所以你可以选择这样简单的东西:

  QVBoxLayout *layout = new QVBoxLayout;
  QLineEdit *lineEdit = new QLineEdit("999");
  lineEdit->setAlignment(Qt::AlignRight);
  QLabel *label = new QLabel("999");
  label->setAlignment(Qt::AlignRight);

  int offsetValue = lineEdit->fontMetrics().averageCharWidth();
  label->setIndent(offsetValue);

  setLayout(layout);
  layout->addWidget(lineEdit);
  layout->addWidget(label);
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,除了子类QLineEdit,仔细检查其绘制事件,确定计算偏移量的位置,并将该值存储在公共成员中以便可以从外部访问它之外别无选择用于抵消标签.

我个人幸运得到了这段代码:

在此输入图像描述