天天看点

qlineedit文本改变时,如何在QLineEdit中更改部分文本的颜色?

qlineedit文本改变时,如何在QLineEdit中更改部分文本的颜色?

I want to add some syntax highlighting to text being written in QLineEdit, but it does not support rich text formatting, I can not change QlineEdit to something else, so I should find how to set color of text in this widget.

Is there a way to do this?

解决方案

Just found a neat trick for that.

static void setLineEditTextFormat(QLineEdit* lineEdit, const QList<:formatrange>& formats)

{

if(!lineEdit)

return;

QList<: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);

}

static void clearLineEditTextFormat(QLineEdit* lineEdit)

{

setLineEditTextFormat(lineEdit, QList<:formatrange>());

}

// Usage example:

QLineEdit* lineEdit = new QLineEdit;

lineEdit->setText(tr("Task Tracker - Entry"));

QList<:formatrange> formats;

QTextCharFormat f;

f.setFontWeight(QFont::Bold);

QTextLayout::FormatRange fr_task;

fr_task.start = 0;

fr_task.length = 4;

fr_task.format = f;

f.setFontItalic(true);

f.setBackground(Qt::darkYellow);

f.setForeground(Qt::white);

QTextLayout::FormatRange fr_tracker;

fr_tracker.start = 5;

fr_tracker.length = 7;

fr_tracker.format = f;

formats.append(fr_task);

formats.append(fr_tracker);

customizeLineEditText(lineEdit, formats);