QLineEdit рисует текст, отличный от фактического текста (заполнитель с текстом () не пуст) - PullRequest
0 голосов
/ 19 мая 2018

Я хочу, чтобы мой подкласс QLineEdit рисовал другой текст (на самом деле, HTML), чем реальный текст.

Более конкретно, когда курсор находится в конце строки, он должен рисовать так, как если бы (HTML)Текст будет: text() + "<font color='gray'>ThisIsExtraText</font>":

enter image description here

Как этого достичь?

Я думаю о переопределении краски ()метод, но мне не нужно менять какое-либо поведение рисования, просто оно должно рисовать другой текст.

Однако я хочу, чтобы во всех отношениях свойство 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 ]

0 голосов
/ 19 мая 2018

Реализация ответа @ 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));
}
0 голосов
/ 19 мая 2018

QLineEdit внутренне использует QTextLayout для рендеринга.Вы можете использовать его для "ThisIsExtraText", создав для него экземпляр QTextLayout и нарисовав его из paintEvent из подкласса QLineEdit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...