Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
Рисование линии 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:
- Как передать точки x,y,x1,y1 в paintEvent()?
Как показали выше: сохранить координаты в полях класса, вызвать update() (repaint лучше не юзать без особых причин) и использовать эти поля в paintEvent()
Как вариант, можно использовать QPainterPath или даже QPicture, это хорошо подойдет если планируется рисовать много линий и добавлять/убирать их в процессе работы приложения. Еще можно нарисовать линии в QImage и затем рисовать получившуюся картинку в paintEvent(), хорошо подойдет для реализации растрового редактора типа MS Paint, но будет привязка к конкретным размерам картинки в пикселях.
Как использовать paintEvent() в любой момент?
Никак, paintEvent вызывается в моменты перерисовки окна графической системой. Если вызвать repaint(), то эта перерисвока произойдет практически сразу же, но лучше не делать код, зависящий от предположения мгновенной перерисовки, и использовать update