Qt Painter за пределами paintEvent - невозможно - обойти? - PullRequest
1 голос
/ 20 января 2011

Похоже, что Qt4 не позволяет рисовать на окнах вне события рисования.У меня есть много кода, который, как ожидается, сможет рисовать линии с резиновыми полосами (общий код рисования для конкретного, проприетарного интерфейса, который я затем реализую в данном пользовательском интерфейсе).Я читал о методе растровых изображений, это было бы много работы, и я не думаю, что это действительно то, что я хочу.

Есть ли обходной путь, который в любом случае позволяет мне делать то, что я хочу?Мне просто нужно нарисовать полосы XOR на экране.

Попробовал флаг WA_PaintOutsidePaintEvent.Затем я увидел фрагмент, который говорит, что он не работает в Windows.

Ответы [ 4 ]

3 голосов
/ 20 января 2011

В современных настольных компьютерах для композитинга рисование окон необходимо синхронизировать с помощью диспетчера окон, чтобы можно было применять альфа-смешение и другие эффекты для правильного создания обратных буферов, результат которых затем переворачивается на экран, чтобыАнимация окон без разрывов.

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

В основном, когда у вас есть рисование в окне: вызовите функцию аннулирования, чтобы запланировать рисование в ближайшее время, и рисуйте во время события рисования.

1 голос
/ 20 января 2011

Просто нарисуйте QPixmap и скопируйте его в реальный виджет в paintEvent. Это единственный стандартный способ. Вы не должны пытаться обойти это.

1 голос
/ 20 января 2011

Похоже, если бы вы могли получить доступ к Hwnd рассматриваемого окна, вы могли бы рисовать на этой поверхности.В противном случае я не уверен.Если под растровым методом вы имеете в виду нечто подобное, я не думаю, что это плохое решение:

m_composed_image = QImage(size, QImage::Format_ARGB32);
m_composed_image.setDotsPerMeterX(dpm);
m_composed_image.setDotsPerMeterY(dpm);
m_composed_image.fill(Qt::transparent);

//paint all image data onto new image
QPainter painter(&m_composed_image);
painter.drawImage(QPoint(0, 0), m_alignment_image); 
0 голосов
/ 02 декабря 2016

Как уже упоминалось в одном из ответов, лучший способ сделать это - создать буфер растровых изображений.Малярные работы будут выполнены в буфере, и когда это будет сделано, repaint() будет запланировано.А функция paintEvent() просто рисует виджет, копируя пиксельный буфер

Я пытался нарисовать круг в области виджета после того, как пользователь ввел значения и нажал кнопку.Это было мое решение.подключение слота drawCircle() к сигналу clicked().

class PaintHelper : public QWidget
{
    Q_OBJECT
private:
    QPixmap *buffer;

public:
    explicit PaintHelper(QWidget *parent = 0) : QWidget(parent)
    {
        buffer=new QPixmap(350,250);// this is the fixe width of this widget so 
        buffer->fill(Qt::cyan);
    }

signals:
public slots:
    void drawCircle(int cx, int cy, int r){


        QPainter painter(buffer);
        painter.setBrush(QBrush(QColor(0,0,255)));

        // A part of mid-point algorithm to draw 1/8 pacrt of circle   
        int x1=0,y1=r;
        int p=1-r;
        for(int i=0;y1>=x1;i++){
            painter.drawPoint(x1+cx,y1+cy);
            x1++;
            if(p>0){
                p+=3+x1;
            }
            else{
                y1--;
                p+=2*x1-2*y1;
                p++;
            }
        }
        this->repaint();
    }



    // QWidget interface
protected:
    void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.drawPixmap(0,0,*buffer);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...