如何有效地设置QTextEdit的背景

易踩的坑

问:为何使用QPalette::WindowQPalette::Background设置QTextEdit的背景样式却不生效?

答:_使用QPalette::Base代替即可。如下所示:

QPalette pal = ui->textEdit->palette();
pal.setBrush(QPalette::Base, Qt::green);
ui->textEdit->setPalette(pal);

运行效果如下:
QTextEdit的颜色设置效果

问:为何按照方案来做,但QTextEdit背景样式却不生效?

答:可能原因较多,这里列出几种。

  1. 父类样式覆盖了本控件的样式。此时可设置本控件的背景为自动填充(不继承于父类):
ui->textEdit->setAutoFillBackground(true);
  1. 设置画刷样式时,ColorRole设置有误。通常网上搜索到的都是使用QPalette::Background,但这种方式是已被Qt废弃了的,应采用新方式QPalette::Base。如下所示:
QPalette pal = ui->textEdit->palette();
pal->setBrush(QPalette::Base, QPixmap("C:/1.jpg"));

读者可自行在Qt的帮助文档中搜索ColorRole,可发现如下内容:

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个问题。

  1. 图片无法自适应大小;
  2. 当书写的文字超过一屏时,编辑框需要翻页,此时会发现图片也跟着翻页。

这2个问题我未进行验证和探究,读者可自行尝试。

个人推荐采用调色板的方式,因为采用C++原生语言实现,更加通用。且不存在上述问题。

猜你喜欢

转载自blog.csdn.net/gkzscs/article/details/100537412