Qt绘制直线箭头

一.使用QPainter绘制

满足条件:

  • 任意角度直线都可绘制箭头
  • 所有箭头同样大小
cpp 复制代码
void MainWindow::paintEvent(QPaintEvent*)
{
    QPainter painter(this);  // 创建QPainter对象,并指定绘制目标为当前的widget
    QLineF line(50,20,500,500);

    double distanceFromEnd1 = 20;
    qreal t = (line.length() - distanceFromEnd1) / line.length();
    QPointF point = line.pointAt(t);//与两端平行点

    double distanceFromEnd2 = 5;
    qreal z = (line.length() - distanceFromEnd2) / line.length();
    QPointF point_center=line.pointAt(z);//中心点

    qreal slope_line = (line.p2().y() - line.p1().y()) / (line.p2().x() - line.p1().x());  // 计算原直线斜率
    double slope = -1 / slope_line;  // 计算垂线的斜率
    double intercept = point.y() - slope * point.x();  // 计算垂线的截距
    const double m=5;//垂线上下两端距离
    double arrow1_x=(point.y()+m-intercept)/slope;
    double arrow2_x=(point.y()-m-intercept)/slope;
    QPointF arrow1(arrow1_x,slope*arrow1_x+intercept);
    QPointF arrow2(arrow2_x,slope*arrow2_x+intercept);
    painter.setRenderHint(QPainter::Antialiasing, true);  // 可选,抗锯齿设置
    painter.setPen(QPen(Qt::black, 2));  // 设置画笔颜色和宽度
    painter.drawLine(line);  // 绘制直线
    painter.setPen(QPen(Qt::green,3));
    painter.drawLine(arrow1,point_center);
    painter.drawLine(arrow2,point_center);
}

二.使用QPainterPath绘制

1.如何使用 GraphicsView 和 QGraphicsScene 绘制

创建一个类继承 GraphicsView
  • graphicsView.h
cpp 复制代码
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#include <QGraphicsView>
#include <QMouseEvent>
#include <QGraphicsLineItem>
#include <QGraphicsPathItem>
#include <QPainterPath>
#include <QDebug>
#include <QObject>
#include <QPointF>
#include <QGraphicsEllipseItem>

class GraphicsView : public QGraphicsView
{
public:
     GraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr);
     void setLineData();
private:
     QGraphicsScene *scene_;
};

#endif // GRAPHICSVIEW_H
  • graphicsview.cpp
cpp 复制代码
#include "graphicsview.h"

GraphicsView::GraphicsView(QGraphicsScene *scene,QWidget *parent ) : QGraphicsView(parent),scene_(scene)
{
    setScene(scene_);
    setLineData();
}
void GraphicsView::setLineData()
{
    QLineF line(100,100,600,400);
    QPen pen(Qt::red,3);
    scene_->addLine(line,pen);

}
主函数中添加私有对象:
cpp 复制代码
private:
    Ui::MainWindow *ui;
    GraphicsView *graphics_view;
    QGraphicsScene *scene;
主函数中调用:
cpp 复制代码
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    scene = new QGraphicsScene(this);


    // 创建 GraphicsView 对象并设置场景
    GraphicsView* graphicsView = new GraphicsView(scene, this);

    // 添加 GraphicsView 对象为中央部件
//    setCentralWidget(graphicsView);
    // 将 GraphicsView 添加到主窗口
//    setCentralWidget(graphicsView);

    setCentralWidget(graphicsView);

    // 设置场景大小为主窗口的大小
    QRectF rect(0, 0, width(), height());
    scene->setSceneRect(rect);

    // 根据视图大小调整窗口大小
    adjustSize();

}
图形显示:

2.绘制箭头

相关推荐
沉到海底去吧Go3 分钟前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
奥修的灵魂4 小时前
QT进阶之路:带命名空间的自定义控件在Qt设计器与qss中的使用技巧
qt·命名空间
笨笨马甲8 小时前
附加模块--Qt OpenGL模块功能及架构
开发语言·qt
uyeonashi12 小时前
【QT控件】输入类控件详解
开发语言·c++·qt
galaxy_strive21 小时前
绘制饼图详细过程
开发语言·c++·qt
委婉待续1 天前
Qt的学习(一)
开发语言·qt·学习
笨笨马甲1 天前
Qt Quick Layout功能及架构
开发语言·qt
feiyangqingyun1 天前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
jllws11 天前
Qt学习及使用_第1部分_认识Qt---学习目的及技术准备
qt·c++框架
到点就困告1 天前
海康工业相机SDK二次开发(VS+QT+海康SDK+C++)
数码相机·qt·海康