7

では、その上にQGraphicsSceneいくつかQGraphicsItemの が設定された背景があります。これらのグラフィック アイテムは任意の形状です。別の QGraphicsItem 、つまり円を作成したいと思います。これらのアイテムの上に配置すると、色で塗りつぶされるのではなく、基本的にこの円内の背景が表示されます。

フォトショップで背景の上に複数のレイヤーを重ねたようなものです。次に、円形マーキー ツールを使用して背景の上のすべてのレイヤーを削除し、円内に背景を表示します。

または、不透明度を設定して表示する別の方法もありますが、この不透明度は、そのすぐ下のアイテムに影響を与え (楕円内のみ)、背景を表示します。

4

1 に答える 1

7

以下はうまくいくかもしれません。これは基本的に法線QGraphicsSceneを拡張し、その背景のみを任意の にレンダリングする機能を備えていますQPainter。次に、「切り取った」グラフィック アイテムは、他のアイテムの上にシーンの背景をレンダリングするだけです。これが機能するには、切り取ったアイテムの Z 値が最も高い必要があります。

スクリーンショット

#include <QtGui>

class BackgroundDrawingScene : public QGraphicsScene {
public:
  explicit BackgroundDrawingScene() : QGraphicsScene() {}
  void renderBackground(QPainter *painter,
                        const QRectF &source,
                        const QRectF &target) {
    painter->save();
    painter->setWorldTransform(
          QTransform::fromTranslate(target.left() - source.left(),
                                    target.top() - source.top()),
          true);
    QGraphicsScene::drawBackground(painter, source);
    painter->restore();
  }
};

class CutOutGraphicsItem : public QGraphicsEllipseItem {
public:
  explicit CutOutGraphicsItem(const QRectF &rect)
    : QGraphicsEllipseItem(rect) {
    setFlag(QGraphicsItem::ItemIsMovable);
  }
protected:
  void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) {
    BackgroundDrawingScene *bgscene =
        dynamic_cast<BackgroundDrawingScene*>(scene());
    if (!bgscene) {
      return;
    }

    painter->setClipPath(shape());
    bgscene->renderBackground(painter,
                              mapToScene(boundingRect()).boundingRect(),
                              boundingRect());
  }
};


int main(int argc, char **argv) {
  QApplication app(argc, argv);

  BackgroundDrawingScene scene;
  QRadialGradient gradient(0, 0, 10);
  gradient.setSpread(QGradient::RepeatSpread);
  scene.setBackgroundBrush(gradient);

  scene.addRect(10., 10., 100., 50., QPen(Qt::SolidLine), QBrush(Qt::red));
  scene.addItem(new CutOutGraphicsItem(QRectF(20., 20., 20., 20.)));

  QGraphicsView view(&scene);
  view.show();

  return app.exec();
}
于 2012-06-15T20:30:01.500 に答える