QGraphicsScene绘制网格背景方法汇总
Published on 2022-06-17 17:54 in 分类: Qt with 萧海~
分类: Qt

QGraphicsScene绘制网格背景方法汇总

    原文:https://wangjichuan.blog.csdn.net/article/details/120082214
    一、通过设置背景画刷-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)
    {
    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:此方法视图放缩,不会像使用背景画刷那样变得不均匀;

    posted @   萧海~  阅读(632)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · winform 绘制太阳,地球,月球 运作规律
    · AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
    · 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
    · 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
    · 上周热点回顾(3.3-3.9)
    点击右上角即可分享
    微信分享提示
    电磁波切换