如何有效地设置QTextEdit的背景

9 篇文章 7 订阅
8 篇文章 1 订阅

易踩的坑

问:为何使用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++原生语言实现,更加通用。且不存在上述问题。

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值