首页 文章

QLineEdit绘制与实际文本不同的文本(带有text()的占位符非空)

提问于
浏览
3

我希望我的QLineEdit子类绘制与真实文本不同的文本(实际上是HTML) .

更具体地说,当光标位于字符串的末尾时,它应该绘制好像(HTML)文本将是 text() + "<font color='gray'>ThisIsExtraText</font>"

enter image description here

怎么能实现这一目标?

我正在考虑覆盖paint()方法,但我真的不需要改变任何绘制行为,只是它应该绘制不同的文本 .

但是,我想通过各种方式,小部件的text()属性保存真实文本,而不是修改后的文本 .

更多细节:我试图实现的行为类似于占位符文本,但是当行编辑小部件中有一些文本时显示它(与占位符不同,当没有文本时显示) .


我遇到的一些问题:

QLineEdit不接受HTML . 我以为我可以在两遍中渲染QLineEdit:

void MyLineEdit::paintEvent(QPaintEvent *event)
{
    if(cursorPosition() == text().length())
    {
        bool oldBlockSignals = blockSignals(true);

        // save old state:
        QString oldText = text();
        QString oldStyleSheet = styleSheet();
        bool oldReadOnly = isReadOnly();

        // change state:
        setText(oldText + "ThisIsExtraText");
        setStyleSheet("color: gray");
        setReadOnly(true);

        // paint changed state:
        QLineEdit::paintEvent(event);

        // restore state:
        setText(oldText);
        setStyleSheet(oldStyleSheet);
        setReadOnly(oldReadOnly);

        blockSignals(oldBlockSignals);
    }
    QLineEdit::paintEvent(event);
}

但paintEvent会清除背景 .

即使我放弃更改颜色,文本也会在光标位于错误位置的情况下呈现 .

2 回答

  • 4

    QLineEdit 内部使用QTextLayout进行渲染 . 您可以通过为它创建 QTextLayout 实例并从 paintEventQLineEdit 的子类中绘制它来将其用于 "ThisIsExtraText" .

  • 3

    执行@ joe_chip的答案:

    void MyLineEdit::paintEvent(QPaintEvent *event)
    {
        QLineEdit::paintEvent(event);
    
        if(!hasFocus()) return;
        if(cursorPosition() < txt.length()) return;
    
        ensurePolished(); // ensure font() is up to date
    
        QRect cr = cursorRect();
        QPoint pos = cr.topRight() - QPoint(cr.width() / 2, 0);
    
        QTextLayout l("ThisIsExtraText", font());
        l.beginLayout();
        QTextLine line = l.createLine();
        line.setLineWidth(width() - pos.x());
        line.setPosition(pos);
        l.endLayout();
    
        QPainter p(this);
        p.setPen(QPen(Qt::gray, 1));
        l.draw(&p, QPoint(0, 0));
    }
    

相关问题