#include "tgraphicsviewrefactor.h"
#include <QWheelEvent>
#include <QGraphicsSvgItem>
#include <QGraphicsRectItem>
#include <QSvgRenderer>
#include <QPainter>
#include <QDebug>
#include <QLayout>
#include <QColor>
#include <QGraphicsOpacityEffect>
TGraphicsViewRefactor::TGraphicsViewRefactor(QWidget *parent)
:QGraphicsView(parent)
{
setRenderHint(QPainter::Antialiasing);
setCacheMode(QGraphicsView::CacheBackground);
setScene(new QGraphicsScene());
SetDefaultItem();
setMinimumSize(QSize(500,500));
this->setMouseTracking(true);
// this->viewport()->layout()->setSpacing(20);
setStyleSheet("margin:10");
// setBackgroundBrush(QBrush(Qt::black));
}
void TGraphicsViewRefactor::SetDefaultItem()
{
QGraphicsScene *s = scene();
// s->setForegroundBrush(Qt::transparent);
// QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect;
// opacityEffect->setOpacity(0.0); // 设置透明度,范围为 0.0(完全透明)到 1.0(完全不透明)
// this->setGraphicsEffect(opacityEffect);
QScopedPointer<QGraphicsSvgItem> svgItem(new QGraphicsSvgItem("C:\\Users\\admin\\Desktop\\SvgPng04.svg"));
if (!svgItem->renderer()->isValid())
return ;
s->clear();
resetTransform();
QGraphicsSvgItem *m_svgItem = svgItem.take();
m_svgItem->setFlags(QGraphicsItem::ItemClipsToShape);
m_svgItem->setCacheMode(QGraphicsItem::NoCache);
m_svgItem->setZValue(0);
s->addItem(m_svgItem);
QGraphicsRectItem * item=new QGraphicsRectItem();
item->setRect(0,0,300,200);
item->setPos(500, 0);
item->setBrush(Qt::red);
m_svgItem->setZValue(0);
s->addItem(item);
repaint();
}
///////////////////////////////////////////// 缩放相关 /////////////////////////////////////////////
void TGraphicsViewRefactor::zoomFactor()
{
const int percent = qRound(transform().m11() * qreal(100));
setWindowTitle("VIEW: "+QString::number(percent) + QLatin1Char('%'));
}
void TGraphicsViewRefactor::wheelEvent(QWheelEvent *event)
{
zoomBy(qPow(1.2, event->delta() / 240.0));
}
void TGraphicsViewRefactor::zoomBy(qreal factor)
{
const qreal currentZoom = transform().m11();
if ((factor < 1 && currentZoom < 0.1) || (factor > 1 && currentZoom > 10))
return;
scale(factor, factor);
zoomFactor();
}
///////////////////////////////////////////// 绘制背景 /////////////////////////////////////////////
#include <QStyleOptionGraphicsItem>
void TGraphicsViewRefactor::paintEvent(QPaintEvent *event)
{
// qDebug()<<"paintEvent ------>";
// QPainter painter(this->viewport()); // this指向QWidget,也可以是QPixmap等
// painter.begin(this); // 调用begin()方法
// DrawHorizonRuler(painter);
// painter.end();
//! 先绘制 scene() 再绘制边框 防止覆盖
//! 绘制QGraphicsItem
QGraphicsView::paintEvent(event);
//! 绘制标尺
QPainter paint(this->viewport());//这行很重要,没有这行的话,绘制出来的东西都会被view里面的其他东西遮住
//! 每次都重复计算了步长和缩放比例D
//! 上边 -X轴
DrawHorizonRuler(paint);
//! 左侧 -Y轴
DrawVerticalRuler(paint);
//! 左上 十符号
DrawRuleCross(paint);
//! 竖线
DrawHorGridLine(paint);
//! 横线
DrawVerGridLine(paint);
//!绘制 面板
//DrawCanvasRect(paint);
}
void TGraphicsViewRefactor::DrawHorizonRuler(QPainter &painter)
{
QPoint lefttop= QPoint(0,0);
QPoint rigthtop=QPoint(this->width(),0);
//! 转换成 QGraphicsScene 坐标
QPointF scene_lefttop=mapToScene(lefttop);
QPointF scene_rigthtop=mapToScene(rigthtop);
float fscale = (scene_rigthtop.x() - scene_lefttop.x())*1.0 / this->width();
int nDistance = 100;
nDistance = ((1.0 / fscale * 100) / 10) * 10;
if (nDistance > 50 && nDistance < 150)
{
nDistance = 100;
}
if (nDistance >= 150 && nDistance < 200)
{
nDistance = 200;
}
// float fDistance = nDistance * 1.0*fscale;
//! 抹除 上边框 20*width 内容
painter.setPen(Qt::white);
painter.setBrush(Qt::white);
QRect rc(0, 0, this->width(), 20);
painter.drawRect(rc);
//! 画下边框线 --为了不出现上 左 右 三条边
painter.setPen(Qt::black);
painter.setBrush(Qt::white);
painter.drawLine(QPoint(20,20),QPoint(this->width(),20));
QPolygon Rightpoints;
int nIndex = 0;
for (int i =0; i < scene_rigthtop.x(); i += nDistance)
{
for (int j = 0; j < 10; ++j)
{
int nxPt = i + j * (nDistance / 10);
QPoint viewpointX=mapFromScene(nxPt,0);
if (viewpointX.x() < 20) //! 为了左上角的符号
continue;
int nyPt = 0;
if (j == 0)
{
nyPt = 0;
}
else if (j % 5 == 0)
{
nyPt = 10;
}
else
{
nyPt = 15;
}
Rightpoints.push_back(QPoint(viewpointX.x(), 20));
Rightpoints.push_back(QPoint(viewpointX.x(), nyPt));
Rightpoints.push_back(QPoint(viewpointX.x(), 20));
}
if (i >= 0)
{
//! 向右偏两像素 避免被遮挡
QPoint viewpointX=mapFromScene(i,0);
painter.setBrush(Qt::black);
painter.drawText(QPoint(viewpointX.x()+2, 14), QString::number(nIndex*nDistance));
}
nIndex++;
}
//////////////////////////////////////////////////////////////////////////
QPolygon Leftpoints;
nIndex = 0;
for (int i =0; i > scene_lefttop.x(); i -= nDistance)
{
for (int j = 0; j < 10; ++j)
{
int nxPt = i - j * (nDistance / 10);
QPoint viewpointX=mapFromScene(nxPt,0);
if (viewpointX.x() < 20) //! 为了左上角的符号
continue;
int nyPt = 0;
if (j == 0)
{
nyPt = 0;
}
else if (j % 5 == 0)
{
nyPt = 10;
}
else
{
nyPt = 15;
}
Leftpoints.push_front(QPoint(viewpointX.x(), 20));
Leftpoints.push_front(QPoint(viewpointX.x(), nyPt));
Leftpoints.push_front(QPoint(viewpointX.x(), 20));
}
if (i <= 0)
{
QPoint viewpointX=mapFromScene(i,0);
painter.setBrush(Qt::black);
//! 向右偏两像素 避免负号被遮挡
painter.drawText(QPoint(viewpointX.x()+2, 14), QString::number(-nIndex * nDistance));
}
nIndex++;
}
painter.setPen(Qt::black);
painter.setBrush(Qt::white);
painter.drawPolyline(Rightpoints);
painter.drawPolyline(Leftpoints);
}
void TGraphicsViewRefactor::DrawVerticalRuler(QPainter &painter)
{
QPoint lefttop= QPoint(0,0);
QPoint leftbtn =QPoint(this->width(),this->height());
//! 转换成 QGraphicsScene 坐标
QPointF scene_lefttop=mapToScene(lefttop);
QPointF scene_leftbtn=mapToScene(leftbtn);
//! 还是以宽 为标准
float fscale = (scene_leftbtn.x() - scene_lefttop.x())*1.0 / this->width();
//! 步长
int nDistance = 100;
nDistance = ((1.0 / fscale * 100) / 10) * 10;
if (nDistance > 50 && nDistance < 150)
{
nDistance = 100;
}
if (nDistance >= 150 && nDistance < 200)
{
nDistance = 200;
}
//! 抹除 左边框 20*height 内容
painter.setPen(Qt::white);
painter.setBrush(Qt::white);
QRect rc(0, 0, 20, this->height());
painter.drawRect(rc);
//! 画右
没有合适的资源?快使用搜索试试~ 我知道了~
Qt QGraphicsView 控件实现标尺和刻度先效果
共2个文件
h:1个
cpp:1个
需积分: 0 5 下载量 78 浏览量
2024-05-20
10:16:14
上传
评论
收藏 4KB RAR 举报
温馨提示
通过重写QGraphicsView 控件的'void paintEvent(QPaintEvent *event) override'事件实现标尺和刻度线效果,直接绘制在控件上,不使用其他控件
资源推荐
资源详情
资源评论
收起资源包目录
tgraphicsviewrefactor.rar (2个子文件)
tgraphicsviewrefactor.h 1KB
tgraphicsviewrefactor.cpp 19KB
共 2 条
- 1
资源评论
得鹿梦鱼、
- 粉丝: 645
- 资源: 29
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功