我想要一个QLineEdit
具有特定占位符文本格式的文本:它需要具有左对齐和右对齐的文本。这是一个例子:
有任何想法吗?
不幸的是,这似乎都是硬编码如下void QLineEdit::paintEvent(QPaintEvent *)
:
if (d->shouldShowPlaceholderText()) {
if (!d->placeholderText.isEmpty()) {
QColor col = pal.text().color();
col.setAlpha(128);
QPen oldpen = p.pen();
p.setPen(col);
QRect ph = lineRect.adjusted(minLB, 0, 0, 0);
QString elidedText = fm.elidedText(d->placeholderText, Qt::ElideRight, ph.width());
p.drawText(ph, va, elidedText);
p.setPen(oldpen);
}
}
如果您愿意,您可以在子类中自己重新实现它。
当然,您也可以“欺骗”空间和字体大小,但这需要更多的工作,最终也会变得更糟糕,更不用说长期可靠性了。
您也可以为 Qt 项目做出贡献以使此类更加灵活,但他们可能会以不够常见的情况为由拒绝它。这取决于维护者。
谢谢,@lpapp!他的建议是正确的。这是我从@lpapp 建议的Qt 源创建的代码:
void LineEdit::paintEvent(QPaintEvent *e) {
QLineEdit::paintEvent(e);
if (!text().isEmpty()) {
return;
}
QPainter p(this);
QStyleOptionFrameV2 panel;
initStyleOption(&panel);
QRect r = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
r.setX(r.x() + textMargins().left());
r.setY(r.y() + textMargins().top());
r.setRight(r.right() - textMargins().right());
r.setBottom(r.bottom() - textMargins().bottom());
QFontMetrics fm = fontMetrics();
int minLB = qMax(0, -fm.minLeftBearing());
int minRB = qMax(0, -fm.minRightBearing());
int vscroll = r.y() + (r.height() - fm.height() + 1) / 2;
static const int horizontalMargin = 2; // QLineEditPrivate::horizontalMargin
QRect lineRect(r.x() + horizontalMargin, vscroll, r.width() - 2*horizontalMargin, fm.height());
QRect ph = lineRect.adjusted(minLB, 0, -minRB, 0);
QColor col = palette().text().color();
col.setAlpha(128);
p.setPen(col);
QString left = fm.elidedText("left", Qt::ElideRight, ph.width());
Qt::Alignment leftAlignment = QStyle::visualAlignment(Qt::LeftToRight, QFlag(Qt::AlignLeft));
p.drawText(ph, leftAlignment, left);
QString right = fm.elidedText("right", Qt::ElideRight, ph.width());
Qt::Alignment rightAlignment = QStyle::visualAlignment(Qt::LeftToRight, QFlag(Qt::AlignRight));
p.drawText(ph, rightAlignment, right);
}
我不知道一个简单的方法来做到这一点。您可以尝试计算两个占位符部分的像素宽度(使用 QFontMetrics),并计算需要在占位符部分之间插入的空格数,以使它们看起来对齐。每当小部件的大小发生变化时,您都需要设置/更新计算的占位符。