【发布时间】:2014-12-19 04:36:47
【问题描述】:
如果小部件使用样式表,是否可以在小部件painEvent 中使用剪辑?
我的问题的背景和原因是我想让小部件在它出现和消失时动画。 (类似于调整大小的圆形或正方形,从中心开始的小区域开始变大)。
我对如何解决这个问题的第一个(也是唯一一个)想法是使用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); 行。
【问题讨论】:
-
你检查the animation framework了吗?
-
不是很多,但据我了解,QAnimation 和朋友是针对动画本身的(随着时间的推移改变值)。但我的问题是在绘图(现在)而不是在动画中。
-
您需要告诉我们,您使用的是哪个版本的 Qt。
-
@user1095108 是的,抱歉。版本是 Qt 4.8.6。我也编辑了这个问题。
标签: qt qt4 qpainter qtembedded qstyle