我希望我的QLineEdit子类绘制与真实文本不同的文本(实际上是HTML) .
更具体地说,当光标位于字符串的末尾时,它应该绘制好像(HTML)文本将是 text() + "<font color='gray'>ThisIsExtraText</font>"
:
怎么能实现这一目标?
我正在考虑覆盖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 回答
QLineEdit
内部使用QTextLayout进行渲染 . 您可以通过为它创建QTextLayout
实例并从paintEvent
的QLineEdit
的子类中绘制它来将其用于"ThisIsExtraText"
.执行@ joe_chip的答案: