QGraphicsScene绘制网格背景方法汇总

本文探讨了在QGraphicsScene中设置网格线时,如何解决背景网格在放缩视图下变得不均匀的问题。作者提供了两种方法:使用背景画刷和重写drawBackground函数,并分析了各自的优缺点。

一、通过设置背景画刷-QPixmap的方法

void ProjectScene::setGrid()
{
    if(showGrid) {
        //两条轴线
        QPolygonF myPolygon1;
        myPolygon1 << QPointF(0, 0) << QPointF(0, 128);
        QPolygonF myPolygon2;
        myPolygon2 << QPointF(0, 0) << QPointF(128, 0);

        //图像大小
        QPixmap pixmap(128, 128);
        pixmap.fill(Qt::transparent);
        QPainter painter(&pixmap);

        //虚线格式
        QVector<qreal> dashes;
        qreal space = 2;
        dashes << 2 << space << 2 << space;

        QPen pen1(Qt::lightGray, 2);
        pen1.setDashPattern(dashes);
        pen1.setWidth(2);
        painter.setPen(pen1);
        painter.translate(0, 0);
        painter.drawPolyline(myPolygon1);
        painter.drawPolyline(myPolygon2);

        painter.setPen(QPen(Qt::red, 4));
        painter.drawPoint(0,0);

        this->setBackgroundBrush(pixmap);
    }else {
        //图像大小
        QPixmap pixmap(128, 128);
        pixmap.fill(Qt::transparent);
        QPainter painter(&pixmap);

        this->setBackgroundBrush(pixmap);
    }
}

缺点:放缩视图,背景网格线会变的不均匀,例如:
在这里插入图片描述
这样在用户看来可能是很不美观的,目前不知道怎么调整。


二、重写void drawBackground(QPainter *painter, const QRectF &rect)

void ProjectScene::drawBackground(QPainter *painter, const QRectF &rect)
{
	QGraphicsScene::drawBackground(painter,rect);
    if(!isShowGrid)
        return;

    Q_UNUSED(rect);
    QPen pen;

    qreal left=rect.left();
    qreal right=rect.right();
    qreal top=rect.top();
    qreal bottom=rect.bottom();

    //边界值调整
    left = (left/128)*128;
    right = (right/128)*128;
    top = (top/128)*128;
    bottom = (bottom/128)*128;

//    pen.setColor(QColor(0,0,0));
//    pen.setWidth(2);
//    pen.setStyle(Qt::SolidLine);
//    painter->setPen(pen);
//    //绘制坐标轴
//    painter->drawLine(left,0,right,0);
//    painter->drawLine(0,top,0,bottom);

    pen.setColor(QColor(60,60,60));
    pen.setWidth(0);
    pen.setStyle(Qt::DashLine);
    painter->setPen(pen);
    //绘制横线
    //绘制Y轴正半轴
    for(int i=0;i>=top;i-=128)
    {
        painter->drawLine(left,i,right,i);
    }
    //绘制Y轴负半轴
    for(int i=0;i<=bottom;i+=128)
    {
        painter->drawLine(left,i,right,i);
    }

    //绘制竖线
    //绘制X轴正半轴
    for(int i=0;i<=right;i+=128)
    {
        painter->drawLine(i,top,i,bottom);
    }
    //绘制X轴负半轴
    for(int i=0;i>=left;i-=128)
    {
        painter->drawLine(i,top,i,bottom);
    }
}

PS:此方法视图放缩,不会像使用背景画刷那样变得不均匀;

在这里插入图片描述

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值