Рисование линии Qt



  • Нужно нарисовать линию из точек x,y в x1,y1:

    class Widget : public QWidget
    {
    protected:
     void paintEvent(QPaintEvent *event)
     {
        QPainter painter(this);
        painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
        painter.drawLine(0, 0, 200, 200);
     }
    };
    int main(int argc, char *argv[])
    {
     QApplication a(argc, argv);
     Widget w;
     w.show();
     return a.exec();
    }
    
    1. Как передать точки x,y,x1,y1 в paintEvent()? 
    2. Как использовать paintEvent() в любой момент?


  • Так а вопрос-то в чём?



  • Если чуть-чуть подправить ваш код:

    class Widget : public QWidget
    {
    public:
        void drawLineNow(qreal startX, qreal startY, qreal endX, qreal endY) { // - для рисования в любой момент
            x1 = startX;
            y1 = startY;
            x2 = endX;
            y2 = endY;
            if(isVisible()) repaint();
        }
    private:
        qreal x1;
        qreal y1;
        qreal x2;
        qreal y2;
    protected:
       void paintEvent(QPaintEvent *event)
       {
          Q_UNUSED(event); 
          QPainter painter(this);
          painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
          painter.drawLine(x1, y1, x2, y2);
       }
    };
    int main(int argc, char *argv[])
    {
     QApplication a(argc, argv);
     Widget w;
     w.show();
     return a.exec();
    }
    


  • @Zhukov said in Рисование линии Qt:

    1. Как передать точки x,y,x1,y1 в paintEvent()?

    Как показали выше: сохранить координаты в полях класса, вызвать update() (repaint лучше не юзать без особых причин) и использовать эти поля в paintEvent()

    Как вариант, можно использовать QPainterPath или даже QPicture, это хорошо подойдет если планируется рисовать много линий и добавлять/убирать их в процессе работы приложения. Еще можно нарисовать линии в QImage и затем рисовать получившуюся картинку в paintEvent(), хорошо подойдет для реализации растрового редактора типа MS Paint, но будет привязка к конкретным размерам картинки в пикселях.

    Как использовать paintEvent() в любой момент?

    Никак, paintEvent вызывается в моменты перерисовки окна графической системой. Если вызвать repaint(), то эта перерисвока произойдет практически сразу же, но лучше не делать код, зависящий от предположения мгновенной перерисовки, и использовать update


Log in to reply