一场由Qt5 painter的drawRect引起的血雨腥风

直接上代码

cpp 复制代码
if (!m_visible || !mMapCanvas) {
        return;
    }

    painter->save();

    // 使用固定像素大小绘制图例
    int legendWidth = 200;
    int legendHeight = 350;
    int margin = 20;

    // 获取画布大小
    QSize canvasSize = mMapCanvas->size();

    // 计算图例在屏幕上的位置(左下角)
    int x = margin;
    int y = canvasSize.height() - legendHeight - margin;

    // 创建屏幕坐标的矩形
    QRectF screenRect(x, y, legendWidth, legendHeight);
    
    // 绘制背景
    painter->setBrush(QColor(255, 255, 255, 210));
    painter->setPen(QPen(Qt::black, 1));
    painter->drawRoundedRect(screenRect, 5, 5);

    // 绘制标题
    painter->setFont(m_font);
    painter->setPen(Qt::black);
    QFontMetrics fm(m_font);
    
    // 图例标题
    QString title1 = QStringLiteral("图例");
    int offset = 10;
    QRectF titleRect1(screenRect.x() + 10, screenRect.y() + offset, screenRect.width() - 20, fm.height());
    painter->drawText(titleRect1, Qt::AlignCenter, title1);
    
    // 土壤含水量标题
    QString title2 = QStringLiteral("土壤含水量");
    QRectF titleRect2(screenRect.x() + 10, screenRect.y() + offset + 30, screenRect.width() - 20, fm.height());
    painter->drawText(titleRect2, Qt::AlignCenter, title2);

    // 绘制色带和数值范围
    double colorBarHeight = legendHeight * 0.75;
    double colorBarWidth = 30;
    double colorBarX = screenRect.x() + 20;
    double colorBarY = screenRect.y() + 60 + offset;
    double colorStep = colorBarHeight / m_colors.size();
    double labelX = colorBarX + colorBarWidth + 15;

    // 计算每个颜色块对应的数值范围
    double valueStep = (m_max - m_min) / m_colors.size();
    //painter->setBrush(Qt::NoBrush);
    for (int i = 0; i < m_colors.size(); i++) {
        // 绘制颜色块
        QRectF colorRect(colorBarX, colorBarY + i * colorStep, colorBarWidth, colorStep);

        painter->fillRect(colorRect, m_colors[i]);
        
        // 绘制颜色块边框
        painter->setPen(QPen(Qt::black));
        painter->drawRect(colorRect);
        
        // 计算数值范围
        double rangeMin = m_min + i * valueStep;
        double rangeMax = m_min + (i + 1) * valueStep;
        
        // 绘制数值范围标签
        QString label = QString::number(rangeMin, 'f', 6) + QStringLiteral(" ~ ") + QString::number(rangeMax, 'f', 6);
        QRectF labelRect(labelX, colorBarY + i * colorStep, screenRect.width() - labelX+40, colorStep);
        painter->drawText(labelRect, Qt::AlignLeft | Qt::AlignVCenter, label);
    }

    painter->restore();

上述代码是进行图例绘制,大致效果如下

但是很明显可以看到,图例颜色不对,很模糊。感觉像是有透明度的意思,查看代码发现painter->setBrush(QColor(255, 255, 255, 210));这一句有透明度,但是这一句设置的不应该影响最终绘制啊,因为下面有这一句painter->fillRect(colorRect, m_colorsi);这一句才是真正填充使用的颜色,但是神奇事情发生了,fillRect这一句的颜色压根不起作用,完全受控于painter->setBrush(QColor(255, 255, 255, 210));这是怎么回事,于是去问deepseek给出的答案也是不对,我就怀疑是不是qt的bug,但是它坚持这不是Qt的bug,好小子,这么坚持。于是开始上网搜,也没搜到个所以然。后来又问deepseek,我把我的所有测试告诉它。他给的答案其中有一个是,后面的绘制遮盖了前面。

但是后面没啥东西了啊,也就一个drawrect,他只绘制边框又不填充,算了,把它注释掉试一下,结果,一试,还真是这的问题,立马发给deepseek,得到了如下答案

长知识了!

相关推荐
神仙别闹6 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
伞伞悦读7 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
2601_966949659 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
m0_7345717610 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
RAN114267600811 小时前
1.3第一个程序的介绍
开发语言·qt
blue_ice .12 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^1382879887212 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
泡海椒13 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)13 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
2501_9336707913 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解
开发语言