Как в QLineEdit выделить часть текста цветным box-ом?

Есть 2 QLineEdit. Пускай в одном вводим предложение "Кот съел колбасу", во втором "Кот колбасу не ел". В первом QLineEdit выделяется слово "Кот" и "колбасу" и во стором те же слова выделяются, разными цветами сответственно. Пусть слово "Кот" будет на желтом фоне в обоих QLineEdit а, "Колбаса" на зеленом фоне.

Вот собственно сам механизм интересует, как выделять разными боксами части текста в QlineEdit, QTextEdit и прочих текстовых блоках


Ответы (1 шт):

Автор решения: Sergey Tatarincev

на форму надо кинуть lineedit. код mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextLayout>
static void setLineEditTextFormat(QLineEdit* lineEdit, const QList<QTextLayout::FormatRange>& formats)
{
    if(!lineEdit)
        return;
    QList<QInputMethodEvent::Attribute> attributes;
    foreach(const QTextLayout::FormatRange& fr, formats)
    {
        QInputMethodEvent::AttributeType type = QInputMethodEvent::TextFormat;
        int start = fr.start - lineEdit->cursorPosition();
        int length = fr.length;
        QVariant value = fr.format;
        attributes.append(QInputMethodEvent::Attribute(type, start, length, value));
    }
    QInputMethodEvent event(QString(), attributes);
    QCoreApplication::sendEvent(lineEdit, &event);
}


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->lineEdit->setText("hello wonderful world");
    QList<QTextLayout::FormatRange> formats;
    QTextCharFormat f;

    f.setFontWeight(QFont::Bold);
    f.setForeground(Qt::blue);
    QTextLayout::FormatRange format_hello;
    format_hello.start = 0;
    format_hello.length = 5;
    format_hello.format = f;

    f.setFontItalic(true);
    f.setBackground(Qt::darkYellow);
    f.setForeground(Qt::white);
    QTextLayout::FormatRange format_wonder;
    format_wonder.start = 6;
    format_wonder.length = 10;
    format_wonder.format = f;

    formats.append(format_hello);
    formats.append(format_wonder);

    setLineEditTextFormat(ui->lineEdit, formats);
}

MainWindow::~MainWindow()
{
    delete ui;
}

в итоге должно получиться такое введите сюда описание изображения

→ Ссылка