Qt自定义QWidget控件设置QSS

目的

自定义QWidget后,发现对于QWidget设置样式失效。想让自定义控件,能够采用QSS中QWidget生效。采用如下方法可以解决:

  1. 调用setAttribute(Qt::WA_StyledBackground,true);
  2. 重写paintEvent
void myWidget::paintEvent(QPaintEvent *)
{
     QStyleOption opt;
   	opt.init(this);
   	QPainter p(this);
   	style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
这里需要在自定义类中写上上边paintEvent中相关内容,切记该类一定要指定父类,设置样式要在它父类或者爷爷类以上中设置,负责也不会生效。
  1. 改成继承 QFrame,因为 QFrame 自带 paintEvent 函数已做了实现,在使用样式表时会进行解析和绘制。
  2. 屏蔽对应属性设置, 导致样式无法生效
    这种情况极少数, 但也是可能出现问题。
    i.e. 1 我之前发生过设置QTreeWidgetItem选中或者其他样式, 当时在QSS文件中通过设置
QTreeWidget::item:selected
{
.......
}

但是对应效果却没出现, 刚开始我还怀疑是不是自己弄错了, 但最后发现 样式没问题, 结果问题在于 QTreeWidgetItem 它本身设置了setFlags(Qt::NoItemFlags); 此效果表示它没有任何属性设置, 因而对应你设置伪状态就没用。

void QTreeWidgetItem::setFlags(Qt::ItemFlags flags)
//Sets the flags for the item to the given flags. These determine whether the item can be selected or modified. This is often used to disable an item.

i.e.2 比如说 MoveDialog 通过paintEvent 实现边框边界为1px的白色, 但是我在某个子类继承该类后, 设置样式

border : 1px solid black;

发现子类设置qss样式没生效. 有两种方案解决 1: 重写子类的paintevent 不调用父类的paintevent 2:取消父类的paintevent, 通过设置qss样式设置, 这样子类设置qss也会生效。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值