ウィジェットがスタイルシートを使用している場合、ウィジェットでクリッピングを使用することは可能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);
さらに、行をまったく削除しても、スタイルシートも描画されることに気付きました。