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

时间:2016-04-25 06:27:52

标签: c++ qt qlayout

我在QLabel下方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);

以下是渲染方式:

enter image description here

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

完整奖励如果您找到适用于所有平台的解决方案,并且在lineEditlabel中字体大小不同时也可以使用

2 个答案:

答案 0 :(得分: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);

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

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

enter image description here

答案 1 :(得分:4)

您是否可以使用QLineEditQLabel来使用两个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看起来不同(文本颜色看起来比标签颜色稍暗,这可能是一件好事,因为它与原始编辑相匹配)

使用QLineEdit代替QLabel的额外好处是价值现在可以选择......

免责声明:我只在Linux上进行了测试,但我没有进行像素级别比较。

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