如何有效地设置QTextEdit的背景
易踩的坑
问:为何按照方案来做,但背景样式却不生效?
答:可能原因较多,这里列出几种。
- 父类样式覆盖了本控件的样式。此时可设置本控件的背景为自动填充(不继承于父类):
ui->textEdit->setAutoFillBackground(true);
- 设置画刷样式时,ColorRole设置有误。通常网上搜索到的都是使用
QPalette::Background
,但这种方式是已被Qt废弃了的,应采用新方式QPalette::Base
。如下所示:
QPalette pal = ui->textEdit->palette();
pal->setBrush(QPalette::Base, QPixmap("C:/1.jpg"));
读者可自行在Qt的帮助文档中搜索ColorRole
,可发现如下内容:
翻译过来的大致意思是:QPalette::Background
值已被弃用,使用QPalette::Window
代替。
然而经过我的试验,对QTextEdit
类型的子控件使用:
QPalette pal = edit->palette();
pal.setBrush(QPalette:Window, Qt::red);
并无任何效果!
可能如ColorRole的描述文档所说,对于文本入口的控件大都使用QPalette::Base
方式来设置样式吧!且这种方式经我试验,证实是可行的。
方案
调色板
// 定义图片路径
const QString fileName = "C:/1.jpg";
QPalette pal = ui->textEdit->palette();
// 设置画刷,填充背景图片,且调整了图片大小
pal.setBrush(QPalette::Base, QPixmap(fileName).scaled(ui->textEdit->size()));
// 取消继承父类的背景样式
ui->textEdit->setAutoFillBackground(true);
// QTextEdit设置调色板,即填充了背景图片
ui->textEdit->setPalette(pal);
实现效果如下:
也可用此方法设置背景颜色,只需要将pal.setBrush()
的参数修改即可。
QPalette pal = ui->textEdit->palette();
// 设置画刷,填充背景颜色
pal.setBrush(QPalette::Base, Qt::red);
// 取消继承父类的背景样式
ui->textEdit->setAutoFillBackground(true);
// QTextEdit设置调色板,即填充了背景图片
ui->textEdit->setPalette(pal);
运行效果如下:
样式表
QString fileName = "C:/1.jpg";
ui->textEdit->setStyleSheet("background-image: url(fileName)");
超文本标记语言
QString fileName = "C:/1.jpg";
ui->textEdit->setHtml("<body background=" + fileName + "></body>");
总结
采用样式表和超文本标记语言的方式设置背景图片都存在2个问题。
- 图片无法自适应大小;
- 当书写的文字超过一屏时,编辑框需要翻页,此时会发现图片也跟着翻页。
这2个问题我未进行验证和探究,读者可自行尝试。
个人推荐采用调色板的方式,因为采用C++原生语言实现,更加通用。且不存在上述问题。