QLineEdit中的自定义占位符

时间:2014-10-22 09:44:10

标签: c++ qt qlineedit qtwidgets

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

example

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

不幸的是,void QLineEdit::paintEvent(QPaintEvent *)中的this seems to be all hard coded如下:

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项目做出贡献,使这个课程更加灵活,但他们可以拒绝它,原因是不够常见。这取决于维护者。

答案 1 :(得分:2)

谢谢,@ lpppp!他的建议是正确的。这是我从@lpapp建议的the Qt sources创建的代码:

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);
}

答案 2 :(得分:1)

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