先看效果:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QVector>
struct GradientLine
{
double pointAX ;
double pointAY ;
double pointBX ;
double pointBY ;
double startLen;
double endLen;
};
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void dradGradientLine(int startX,int startY,int endX,int endY,int startLen,int endLen);
private:
Ui::MainWindow *ui;
QVector<GradientLine> mVector;
protected:
void paintEvent(QPaintEvent *);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include "math.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
dradGradientLine(90,120,300,400,1,2);
dradGradientLine(90,150,90,400,1,2);
dradGradientLine(46,99,10,234,1,2);
dradGradientLine(46,88,10,555,1,8);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dradGradientLine(int startX, int startY, int endX, int endY, int startLen, int endLen)
{
GradientLine tempLine ;
tempLine.pointAX = startX;
tempLine.pointAY = startY;
tempLine.pointBX = endX;
tempLine.pointBY = endY;
tempLine.startLen = startLen;
tempLine.endLen = endLen;
mVector.append(tempLine);
}
void MainWindow::paintEvent(QPaintEvent *e)
{
for(int i = 0; i < mVector.size();i++)
{
GradientLine tempLine = mVector.at(i);
int pointA1X ;
int pointA2X ;
int pointB1X ;
int pointB2X ;
int pointA1Y ;
int pointA2Y ;
int pointB1Y ;
int pointB2Y ;
if(tempLine.pointAX != tempLine.pointBX && tempLine.pointAY != tempLine.pointBY)
{
//
double gradient = double(tempLine.pointBY - tempLine.pointAY)/double(tempLine.pointBX - tempLine.pointAX);
// qDebug()<<"gradient:"<<gradient;
double sinVal = sin(atan(gradient));
double cosVal = cos(atan(gradient));
double dAx = ((double)tempLine.startLen/2) * sinVal;
double dAy = ((double)tempLine.startLen/2) * cosVal;
double dBx = ((double)tempLine.endLen/2) * sinVal;
double dBy = ((double)tempLine.endLen/2) * cosVal;
pointA1X = qRound(tempLine.pointAX + dAx);
pointA2X = qRound(tempLine.pointAX - dAx);
pointB1X = qRound(tempLine.pointBX + dBx);
pointB2X = qRound(tempLine.pointBX - dBx);
pointA1Y = qRound(tempLine.pointAY - dAy);
pointA2Y = qRound(tempLine.pointAY + dAy);
pointB1Y = qRound(tempLine.pointBY - dBy);
pointB2Y = qRound(tempLine.pointBY + dBy);
// qDebug()<<pointA1X<<pointA1Y;
// qDebug()<<pointA2X<<pointA2Y;
// qDebug()<<pointB1X<<pointB1Y;
// qDebug()<<pointB2X<<pointB2Y;
}
else if(tempLine.pointAX == tempLine.pointBX)//垂直
{
double dAx = ((double)tempLine.startLen/2) * 1;
double dAy = 0;
double dBx = ((double)tempLine.endLen/2) * 1;
double dBy = 0;
pointA1X = qRound(tempLine.pointAX + dAx);
pointA2X = qRound(tempLine.pointAX - dAx);
pointB1X = qRound(tempLine.pointBX + dBx);
pointB2X = qRound(tempLine.pointBX - dBx);
pointA1Y = qRound(tempLine.pointAY - dAy);
pointA2Y = qRound(tempLine.pointAY + dAy);
pointB1Y = qRound(tempLine.pointBY - dBy);
pointB2Y = qRound(tempLine.pointBY + dBy);
}
else if(tempLine.pointAY == tempLine.pointBY)//水平
{
double dAx = ((double)tempLine.startLen/2) * 0;
double dAy = ((double)tempLine.startLen/2) * 1;
double dBx = ((double)tempLine.endLen/2) * 0;
double dBy = ((double)tempLine.endLen/2) * 1;
pointA1X = qRound(tempLine.pointAX + dAx);
pointA2X = qRound(tempLine.pointAX - dAx);
pointB1X = qRound(tempLine.pointBX + dBx);
pointB2X = qRound(tempLine.pointBX - dBx);
pointA1Y = qRound(tempLine.pointAY - dAy);
pointA2Y = qRound(tempLine.pointAY + dAy);
pointB1Y = qRound(tempLine.pointBY - dBy);
pointB2Y = qRound(tempLine.pointBY + dBy);
}
// 绘制文本
// painter.drawLine(90,120,300,400);
QPainter painter(this);
// 反走样
painter.setRenderHint(QPainter::Antialiasing, true);
// 设置画笔颜色
painter.setPen(QColor(255, 160, 90));
// 各个点的坐标
QPointF points[4] = {QPointF(pointA1X, pointA1Y), QPointF(pointA2X, pointA2Y), QPointF(pointB2X, pointB2Y), QPointF(pointB1X, pointB1Y)};
// 绘制多边形
painter.setBrush(QColor(255, 160, 90));
painter.drawPolygon(points, 4);
}
}