painEvent
如果小部件使用样式表,是否可以在小部件中使用剪辑?
我的问题的背景和原因是我想让小部件在它出现和消失时动画。(类似于调整大小的圆形或正方形,从中心的小区域开始变大)。
我对如何解决这个问题的第一个(也是唯一一个)想法是使用 a 的剪裁QPainter
,以便只绘制所需的区域。
如果我使小部件的背景透明并使用它的原始绘图功能QPainter
就可以正常工作。但是,如果小部件应用了样式表,我该如何解决这个问题?甚至可能吗?
使用的Qt版本是Qt 4.8.6
我的问题是:
- 是否可以通过上述策略实现我想要的?
- 是否也可以以任何方式剪辑所有孩子?
- 我的策略是合适的还是以这种方式解决它是一个坏主意?
- 是否有任何其他想法、最佳实践、Qt 类……可以给我想要的东西?
附加信息
我没有太多代码要显示,因为我坚持使用这种剪裁内容。但这里有一些东西可以让我了解我尝试过的东西:
这行得通。
/* Shows a small red circle inside the widget as expected */
void MyAnimatingWidget::paintEvent(QPaintEvent *ev) {
QPainter painter(this);
QRect rect = this->geometry()
QStyleOption opt;
painter.setClipRegion(QRegion(rect.width()/2,
rect.height()/2,
150, 150,
QRegion::Ellipse));
painter.setPen(QColor(255, 0, 0));
painter.setBrush(QColor(255, 0, 0));
painter.setOpacity(1);
painter.drawRect(rect);
}
但以下不会改变任何东西:
/* This shows the widget as usual */
void MyAnimatingWidget::paintEvent(QPaintEvent *ev) {
QPainter painter(this);
QRect rect = this->geometry();
QStyleOption opt;
painter.setClipRegion(QRegion(rect.width()/2,
rect.height()/2,
150, 150,
QRegion::Ellipse));
painter.setRenderHint(QPainter::Antialiasing);
painter.setOpacity(1);
opt.init(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
}
此外,我注意到,样式表也被绘制了,即使我完全删除了这style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
条线。