1

我想要一个QLineEdit具有特定占位符文本格式的文本:它需要具有左对齐和右对齐的文本。这是一个例子:

例子

有任何想法吗?

4

3 回答 3

5

不幸的是,这似乎都是硬编码如下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 项目做出贡献以使此类更加灵活,但他们可能会以不够常见的情况为由拒绝它。这取决于维护者。

于 2014-10-22T10:28:27.923 回答
2

谢谢,@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);
}
于 2014-10-23T03:33:21.173 回答
1

我不知道一个简单的方法来做到这一点。您可以尝试计算两个占位符部分的像素宽度(使用 QFontMetrics),并计算需要在占位符部分之间插入的空格数,以使它们看起来对齐。每当小部件的大小发生变化时,您都需要设置/更新计算的占位符。

于 2014-10-22T10:17:02.667 回答