2

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

4

1 に答える 1