Qt Painter outside paintEvent - impossible - workaround?

前端 未结 4 2004
走了就别回头了
走了就别回头了 2020-12-22 02:27

So it appears that Qt4 doesn\'t let you draw on windows outside of a paint event. I have a lot of code that expects to be able to in order to draw rubber band lines (generi

4条回答
  •  一生所求
    2020-12-22 02:52

    As it's mentioned in one of the answers, The best way to do it will be to make a pixmap buffer. The painting works will be done in the buffer and when it's done, repaint() will be scheduled. And the paintEvent() function just paints the widget by copying the pixel buffer

    I was trying to draw a circle on a widget area after user inputs values and pushes a button. This was my solution. connecting the drawCircle() slot to the clicked() signal.

    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);
        }
    };
    

提交回复
热议问题