Нарисуйте разноцветную линию в Qt - PullRequest
4 голосов
/ 03 февраля 2012

Я пытаюсь добиться следующего: у меня есть QGraphicsScene с показанным QGraphicsPixmapItem.Растровое изображение имеет несколько цветов, и мне нужно нарисовать линию поперек растрового изображения, которая должна быть видимой и распознаваемой в каждой отдельной точке.

Моя идея состоит в том, чтобы нарисовать линию, где каждый пиксель имеет отрицательный (дополнительный) цветотносительный пиксель растрового изображения.Поэтому я подумал о создании подкласса QGraphicsItem и переопределении метода paint() для рисования разноцветной линии.

Однако я застрял, потому что не знаю, как я могу получить информацию о пикселях из растрового изображенияиз функции paint, и даже если я узнаю, я не могу придумать способ нарисовать линию таким образом.

Не могли бы вы дать мне несколько советов о том, как действовать?

1 Ответ

12 голосов
/ 03 февраля 2012

Вы можете использовать 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);
        }
};

Это выведет что-то вроде следующего изображения:

Fat inverted line over funky colors

Поэкспериментируйте с другими режимами композиции , чтобы получить более интересные эффекты.

...