对齐来自 QLabel 和 QLineEdit 的正确文本

Posted

技术标签:

【中文标题】对齐来自 QLabel 和 QLineEdit 的正确文本【英文标题】:Align to the right text from QLabel and QLineEdit 【发布时间】:2016-04-25 06:27:52 【问题描述】:

我在 QLineEdit 下方有一个 QLabel,具有相同的大小和对齐属性:

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 中的字体大小不同时也适用。

【问题讨论】:

如您所见,QLineEdit 使用从边框到文本的分隔空间(很像 QLayout 的边距。您可以在 label 周围添加布局以模拟这种行为 看看doc.qt.io/qt-4.8/qlabel.html#indent-prop 如果你需要计算一个精确的填充,你可以检查QLineEdit::textMargins()加上考虑边框宽度。 【参考方案1】:

不幸的是,这可能是不可能的,至少不是开箱即用,右边距不起作用,因为即使文本明显向左偏移,它也始终为 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,仔细检查其绘制事件,确定计算偏移量的位置,并将该值存储在公共成员中以便它可以从外部访问以用于偏移标签。

我个人很幸运能够使用该代码:

【讨论】:

这是相当简单的代码!由于当 QTextEdit 字体大小大于 QLabel 时它不起作用,所以我没有回答这个问题。【参考方案2】:

您能不使用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 上测试过,没有做过像素级别的比较。

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

【讨论】:

【参考方案3】:

简单地说,你可以使用 QLabel 的 indent 属性。

https://doc.qt.io/qt-5/qlabel.html#indent-prop

indent 属性可以采用 +/- 值。也许边距功能可以发挥作用。

【讨论】:

以上是关于对齐来自 QLabel 和 QLineEdit 的正确文本的主要内容,如果未能解决你的问题,请参考以下文章

Python PyQt5:如果 QLineEdit 为空,如何更改 QLabel 的颜色?

QlineEdit 和信号&槽

Qt中想产生可以随一些条件变化的文本,像是QLabel那样只能看到文字的

QLabel 破坏了布局的中心对齐

单行文本框QLineEdit

QT QT练习一