4

私が達成しようとしているのは次のとおりQGraphicsSceneですQGraphicsPixmapItem。ピックスマップには複数の色があり、ピックスマップ全体に線を引く必要があります。この線は、すべての点で表示および認識できる必要があります。

私の考えは、すべてのピクセルがピックスマップの相対ピクセルの負の(補色)色を持つ線を引くことです。そこで、マルチカラーの線を描く方法をサブクラス化QGraphicsItemして再実装することを考えました。paint()

しかし、関数からピックスマップのピクセル情報を取得する方法がわからないために行き詰まっておりpaint、見つけたとしても、このように線を引く方法を考えることはできません。

進め方についてアドバイスをいただけますか?

4

1 に答える 1

12

QPainter'sプロパティを使用するcompositionModeと、ソースピクセルの色を読み取ることなく、このようなことを非常に簡単に行うことができます。

QWidgetカスタム実装を使用した単純なサンプル。これは、アイテムのメソッドpaintEventに適応できるはずです。paint

#include <QtGui>

class W: public QWidget {
    Q_OBJECT

    public:
        W(QWidget *parent = 0): QWidget(parent) {};

    protected:
        void paintEvent(QPaintEvent *) {
            QPainter p(this);

            // Draw boring background
            p.setPen(Qt::NoPen);
            p.setBrush(QColor(0,255,0));
            p.drawRect(0, 0, 30, 90);
            p.setBrush(QColor(255,0,0));
            p.drawRect(30, 0, 30, 90);
            p.setBrush(QColor(0,0,255));
            p.drawRect(60, 0, 30, 90);

            // This is the important part you'll want to play with
            p.setCompositionMode(QPainter::RasterOp_SourceAndNotDestination);
            QPen inverter(Qt::white);
            inverter.setWidth(10);
            p.setPen(inverter);
            p.drawLine(0, 0, 90, 90);
        }
};

これにより、次の画像のようなものが出力されます。

ファンキーな色の上の太い逆線

他の合成モードを試して、より興味深い効果を取得してください。

于 2012-02-03T14:34:27.860 に答える