目的
自定义QWidget后,发现对于QWidget设置样式失效。想让自定义控件,能够采用QSS中QWidget生效。采用如下方法可以解决:
- 调用setAttribute(Qt::WA_StyledBackground,true);
- 重写paintEvent
void myWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
这里需要在自定义类中写上上边paintEvent中相关内容,切记该类一定要指定父类,设置样式要在它父类或者爷爷类以上中设置,负责也不会生效。
- 改成继承 QFrame,因为 QFrame 自带 paintEvent 函数已做了实现,在使用样式表时会进行解析和绘制。
- 屏蔽对应属性设置, 导致样式无法生效
这种情况极少数, 但也是可能出现问题。
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也会生效。