自学内容网 自学内容网

处理继承自QWidget类的自定义类背景样式不生效问题【Qt】

处理继承自QWidget类的自定义类背景样式不生效问题

问题

问题抛出:
  当我们定义一个自定义类,并且继承自QWidget类:
在这里插入图片描述
  为我们的自定义类进行构造:
在这里插入图片描述
  这是运行后的表现,其中每一份测试人物,头像,签名的组成来自于我们自定义的SessionFriendItem类。
在这里插入图片描述
我们要实现鼠标移动到控件上面时,控件的背景颜色变化,下面是代码实现:
在这里插入图片描述
运行后:
在这里插入图片描述
  运行后发现我们命名更改的是整个SessionFriendItem的背景颜色(在设置样式表的时候,当SessionFriendItem继承于QWidget,可以将SessionFriendItem看作QWidget,此处修改的为QWidget定义背景颜色,也就是定义SessionFriendItem的背景颜色),但是运行时发现并没有做到。

解答

解答:
  如果是一个内置类型的类继承自QWidget,当设置上面一系列操作时不会出现这个问题,这是因为内置的类重写了paintEvent函数,我们的样式表底层就是通过QPainter等画笔操作实现的,对于Qt内置的类,已经在paintEvent函数中处理好了相关的细节,在我们使用自定义的类想实现这个操作的话,就得手动实现paintEvent函数,这个在官方文档中有说明:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面是步骤,我们需要加上官方文档上的paintEvent函数的代码:
在这里插入图片描述
  此时测试发现问题得到了解决。
在这里插入图片描述
  至于文档中的这段代码,大致理解为读取我们给出的样式信息,然后调用底层设置样式的函数接口,将样式画出来。

void SessionFriendItem::paintEvent(QPaintEvent *event)
{
    (void) event;
    QStyleOption opt;
    opt.initFrom(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

  总结就是:Qt中,如果是给QWidget的子类通过qss设置背景色,默认情况下是不生效的,需要加上官方文档上的paintEvent函数,才能生效。


         新人创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看。


原文地址:https://blog.csdn.net/tang20030306/article/details/143717894

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!