Qt | 绘制直线与 QLineF 类

点击上方"蓝字"关注我们

01、绘制直线

02、Qline和QLineF

【1】QLine 是整型版本,成员函数较少,QLineF 是精度更高的浮点型版本,本文以 QLineF 类

进行讲解。

QLineF 类提供了一个二维向量,使用 QLineF 类绘制直线可以利用该类中的成员函数方便

的对线条的属性进行一些设置,比如可使用 setAngle()设置线条的角度,使用 angle()可获

取线条的角度等。下面为该类中的函数

1)、QLineF(); QLineF(const QLine &line)QLineF(const QPointF &p1, const QPointF &p2); //构造从 p1 到 p2 的线QLineF(qreal x1, qreal y1, qreal x2, qreal y2); //构造从(x1,y1)到(x2,y2)的线

【2】起点/终点与分量

QPointF p1() const; QPointF p2() const; qreal dx() const
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的示例,演示如何在Qt中使用鼠标绘制直线图: ```cpp #include <QtGui> #include <Widgets> class Line : public QGraphicsLineItem { public: Line(const QLineF& line) : QGraphicsLineItem(line) {} QRectF boundingRect() const override { return pen().widthF() + 20.0 + QGraphicsLineItem::boundingRect(); } QPainterPath shape() const override { QPainterPath path = QGraphicsLineItem::shape(); path.addRect(boundingRect()); return path; } void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override { if (option->state & QStyle::State_Selected) { painter->setPen(QPen(option->palette.windowText(), 0, Qt::DotLine)); painter->drawRect(boundingRect()); } QGraphicsLineItem::paint(painter, option, widget); } }; class GraphicsView : public QGraphicsView { public: GraphicsView(QWidget* parent = nullptr) : QGraphicsView(parent), m_isDrawing(false), m_line(nullptr) { setRenderHint(QPainter::Antialiasing); setDragMode(QGraphicsView::RubberBandDrag); setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing); setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); setSelectionMode(QGraphicsView::SingleSelection); } protected: void mousePressEvent(QMouseEvent* event) override { if (event->button() == Qt::LeftButton) { m_startPos = mapToScene(event->pos()); m_isDrawing = true; } QGraphicsView::mousePressEvent(event); } void mouseMoveEvent(QMouseEvent* event) override { if (m_isDrawing) { if (!m_line) { m_line = new Line(QLineF(m_startPos, mapToScene(event->pos()))); scene()->addItem(m_line); } else { m_line->setLine(QLineF(m_startPos, mapToScene(event->pos()))); } } QGraphicsView::mouseMoveEvent(event); } void mouseReleaseEvent(QMouseEvent* event) override { if (event->button() == Qt::LeftButton && m_isDrawing) { m_isDrawing = false; m_line = nullptr; } QGraphicsView::mouseReleaseEvent(event); } private: bool m_isDrawing; QPointF m_startPos; Line* m_line; }; int main(int argc, char* argv[]) { QApplication app(argc, argv); QGraphicsScene scene; GraphicsView view(&scene); view.setRenderHint(QPainter::Antialiasing); view.setScene(&scene); view.setDragMode(QGraphicsView::RubberBandDrag); QGraphicsLineItem* line = new QGraphicsLineItem(QLineF(0.0, 0.0, 100.0, 100.0)); line->setPen(QPen(Qt::red, 2)); scene.addItem(line); QGraphicsEllipseItem* ellipse = new QGraphicsEllipseItem(QRectF(0.0, 0.0, 100.0, 100.0)); ellipse->setPen(QPen(Qt::blue, 2)); ellipse->setBrush(QBrush(Qt::green)); scene.addItem(ellipse); view.setSceneRect(-150, -150, 300, 300); view.setFixedSize(300, 300); view.show(); return app.exec(); } ``` 该示例演示了如何使用QGraphicsView和QGraphicsScene来绘制直线。在鼠标按下时,记录起始位置,并在鼠标移动时绘制直线。在鼠标释放时,停止绘制。该示例还演示了如何添加其他型的图元,如椭圆和直线

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qt历险记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值