提交 8b1b11ff 编写于 作者: mahuifa's avatar mahuifa

新功能:Transformations中增加renderarea类

    1、实现renderarea类中绘制虚线框、缩放、选择、偏移坐标轴、绘制坐标轴功能。
上级 9a744524
......@@ -27,9 +27,11 @@ DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
renderarea.cpp \
widget.cpp
HEADERS += \
renderarea.h \
widget.h
# Default rules for deployment.
......
#include "renderarea.h"
#include <QDebug>
#include <qpainter.h>
RenderArea::RenderArea(QWidget *parent) : QWidget(parent)
{
this->setMinimumSize(200, 200);
// 设置背景填充色
this->setBackgroundRole(QPalette::Base);
this->setAutoFillBackground(true);
QFont newFont = this->font();
newFont.setPixelSize(20); // 设置字体大小
this->setFont(newFont); // 设置当前类使用的字体
QFontMetrics fontMetrics(newFont); // QFontMetrics 类提供字体度量信息。
m_fontRectX = fontMetrics.boundingRect("X"); // 返回由 text 指定的字符串中字符的边界矩形
m_fontRectY = fontMetrics.boundingRect("Y");
}
/**
* @brief 重绘事件函数
* @param event
*/
void RenderArea::paintEvent(QPaintEvent *event)
{
QWidget::paintEvent(event);
QPainter painter(this); // 创建一个画家对象
painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿
painter.translate(60, 60); // 坐标原点偏移到(60, 60)位置
drawOutline(painter); // 画一个虚线矩形框
painter.save(); // 保存当前绘制状态,save()后所有QPainter设置在restore()后将失效(比如画笔设置)
transformPainter(painter); // 设置偏移、缩放、旋转
drawCoordinates(painter); // 绘制坐标系
painter.restore();
}
/**
* @brief 画一个虚线矩形框
* @param painter
*/
void RenderArea::drawOutline(QPainter &painter)
{
painter.save(); // 将QPainter状态保存,后面的设置不会产生影响
painter.setPen(Qt::darkBlue); // 设置画笔颜色
painter.setPen(Qt::DashLine); // 画笔样式为虚线
painter.drawRect(0, 0, 100,100); // 画虚线矩形
painter.restore();
}
/**
* @brief 在这个函数中设置画家对象的坐标原点偏移、旋转、缩放
* @param painter
*/
void RenderArea::transformPainter(QPainter &painter)
{
for(auto operation : operations)
{
switch (operation)
{
case Translate:
painter.translate(50, 50); // 坐标原点偏移 50 像素
break;
case Scale:
painter.scale(0.75, 0.75); // 缩小到原来的75%大小
break;
case Rotate:
painter.rotate(60); // 顺时针旋转60度
break;
default:break;
}
}
}
/**
* @brief 绘制当前画图使用的坐标系
* @param painter
*/
void RenderArea::drawCoordinates(QPainter &painter)
{
painter.save();
painter.setPen(Qt::red);
painter.drawLine(0, 0, 50, 0); // 绘制X轴直线
painter.drawLine(45, -3, 50, 0); // 画X轴箭头
painter.drawLine(45, 3, 50, 0);
painter.drawText(QRect(50, 0, m_fontRectX.width(), -m_fontRectX.height()), Qt::AlignCenter, "X");
painter.drawLine(0, 0, 0, 50); // 绘制Y轴
painter.drawLine(3, 45, 0, 50); // 画Y轴箭头
painter.drawLine(-3, 45, 0, 50);
painter.drawText(QRect(0, 50, -m_fontRectX.width(), m_fontRectX.height()), Qt::AlignCenter, "Y");
painter.restore();
}
#ifndef RENDERAREA_H
#define RENDERAREA_H
#include <QWidget>
// 绘图操作类型
enum Operation {
NoOperation, // 没有进行操作
Translate, // 偏移绘图坐标原点
Rotate, // 以坐标原点为中心进行旋转
Scale // 将绘制图案按比例缩放
};
class RenderArea : public QWidget
{
Q_OBJECT
public:
explicit RenderArea(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
void drawOutline(QPainter& painter);
void transformPainter(QPainter& painter);
void drawCoordinates(QPainter& painter);
public slots:
private:
QList<Operation> operations; // 保存所有的缩放、偏移、旋转操作
QRect m_fontRectX; // X轴字体矩形范围
QRect m_fontRectY; // Y轴字体矩形范围
};
#endif // RENDERAREA_H
#include "widget.h"
#include "renderarea.h"
#include <qcombobox.h>
#include <qgridlayout.h>
Widget::Widget(QWidget *parent): QWidget(parent)
{
initUI();
}
Widget::~Widget()
......@@ -10,6 +15,30 @@ Widget::~Widget()
void Widget::initUI()
{
m_originalRenderArea = new RenderArea(this);
m_comShape = new QComboBox(this);
m_comShape->addItem("时钟图案");
m_comShape->addItem("房子图案");
m_comShape->addItem("文字图案");
m_comShape->addItem("卡车图案");
// 添加布局
QGridLayout* layout = new QGridLayout(this);
layout->addWidget(m_originalRenderArea, 0, 0);
layout->addWidget(m_comShape, 1, 0);
for(int i = 0; i < NumTransformendAreas; i++)
{
m_transformedRenderAreas[i] = new RenderArea(this);
m_comOperation[i] = new QComboBox(this);
m_comOperation[i]->addItem("默认状态");
m_comOperation[i]->addItem("旋转60度");
m_comOperation[i]->addItem("缩小75%");
m_comOperation[i]->addItem("坐标原点偏移(50,50)");
// 添加布局
layout->addWidget(m_transformedRenderAreas[i], 0, i + 1);
layout->addWidget(m_comOperation[i], 1, i + 1);
}
}
......@@ -5,6 +5,7 @@
QT_BEGIN_NAMESPACE
class QComboBox;
class RenderArea;
QT_END_NAMESPACE
class Widget : public QWidget
......@@ -24,5 +25,7 @@ private:
QComboBox* m_comShape = nullptr; // 绘制图案选择
QComboBox* m_comOperation[NumTransformendAreas]; // 包含多个QComboBox指针的指针数组
QList<QPainterPath> m_shapes; // 绘制图案
RenderArea* m_originalRenderArea = nullptr; // 原始渲染区域
RenderArea* m_transformedRenderAreas[NumTransformendAreas]; // 可进行缩放、偏移、旋转的区域
};
#endif // WIDGET_H
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册