From 10:00 CET Friday 22nd November we will adjust how the server works to deal with some recently reported problems. Therefore there may be a load problem, if you experience more problems than usual trying to access the forum then please PM AndyS or any of the moderators so they can inform me.


Рисование линии 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