6

我有一个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);

这是如何呈现的:

在此处输入图像描述

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

如果您找到适用于所有平台的解决方案,并且在lineEditlabel.

4

2 回答 2

9

不幸的是,这可能是不可能的,至少不是开箱即用,右边距将不起作用,因为即使文本明显向左偏移,它也始终为 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);

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

我个人对这段代码很幸运:

在此处输入图像描述

于 2016-04-28T09:21:29.963 回答
4

你能不使用 aQLineEdit和 aQLabel来使用两个 QLineEdits 吗?

考虑以下:

QWidget* widget = new QWidget();
// Original line edit
QLineEdit *lineEdit1 = new QLineEdit("999");
lineEdit1->setFixedWidth(100);
lineEdit1->setAlignment(Qt::AlignRight);
lineEdit1->setStyleSheet("border-width: 2px;");
// A suggestion if you want a label
QLabel *label = new QLabel("999");
label->setFixedWidth(100);
label->setAlignment(Qt::AlignRight);
label->setStyleSheet("border: 2px solid rgba(255, 0, 0, 0%)");
// Alternatively if you can use another QLineEdit
QLineEdit *lineEdit2 = new QLineEdit("999");
lineEdit2->setFixedWidth(100);
lineEdit2->setAlignment(Qt::AlignRight);
lineEdit2->setReadOnly(true);
lineEdit2->setStyleSheet("background: rgba(0, 0, 0, 0%);  "
                         "border-width: 2px;              "
                         "border-style: solid;            "
                         "border-color: rgba(0, 0, 0, 0%);");
// Bring it all together
QLayout *layout = new QVBoxLayout(widget);
layout->addWidget(lineEdit1);
layout->addWidget(label);
layout->addWidget(lineEdit2);
widget->show();

它强制所有边框为 2px,所以在不同的平台上它应该是相同的。第二个QLineEdit看起来应该与QLabel(文本颜色看起来比标签的颜色稍暗,这可能是一件好事,因为它与原始编辑相匹配)

使用 aQLineEdit而不是 the的额外好处QLabel是该值现在是可选择的...

免责声明:我只在 Linux 上测试过,我没有做过像素级别的比较。

编辑:我看到对齐失败,字体大小不同。

于 2016-04-29T06:45:23.097 回答