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.绘制箭头

相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能13 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G13 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt