QT实现十字线

文章介绍了如何在Qt应用中利用QPainter绘制带有量尺和动态数值的十字准星,包括水平和垂直线、刻度线以及从配置文件获取的像素值和测量值的显示。
摘要由CSDN通过智能技术生成

效果:

以中间为准的尺

 

 int resolutionWidth = m_resolution.width();
        int resolutionHeight = m_resolution.height();

        QPixmap pixmap(resolutionWidth, resolutionHeight);
        pixmap.fill(Qt::transparent);

        QPainter painter(&pixmap);
        painter.setPen(QPen(Qt::red, 2)); // 设置画笔颜色为红色,宽度为2

        // 绘制垂直线
        painter.drawLine(resolutionWidth / 2, 0, resolutionWidth / 2, resolutionHeight);
        // 绘制水平线
        painter.drawLine(0, resolutionHeight / 2, resolutionWidth, resolutionHeight / 2);

        int centerX = resolutionWidth / 2;
        int centerY = resolutionHeight / 2;


        // 在十字中间添加值
        QString centerText = "Center";
        QRectF centerRect(centerX + 20,  centerY , 40, 20);
        painter.drawText(centerRect, Qt::AlignCenter, centerText);

//        // 绘制量尺

        int rulerLength = m_resolution.width(); // 量尺长度
        int tickSpacing = 10; // 刻度间距


        // 绘制水平中心线上的量尺
        int rulerStartXHorizontal = centerX - rulerLength / 2; // 水平量尺起始位置X坐标
        int rulerStartYHorizontal = centerY; // 水平量尺起始位置Y坐标

        for (int i = 0; i <= rulerLength; i += tickSpacing) {
            int tickHeight = (i % (tickSpacing * 5) == 0) ? 20 : 10; // 长刻度的高度为20,短刻度的高度为10

            painter.drawLine(rulerStartXHorizontal + i , rulerStartYHorizontal , rulerStartXHorizontal + i, rulerStartYHorizontal - tickHeight ); // 绘制刻度线
        }


        // 绘制垂直中心线上的量尺
        int rulerStartXVertical = centerX; // 垂直量尺起始位置X坐标
        int rulerStartYVertical = centerY + rulerLength / 2; // 垂直量尺起始位置Y坐标

        for (int i = 0; i <= rulerLength; i += tickSpacing) {
            int tickWidth = (i % (tickSpacing * 5) == 0) ? 20 : 10; // 长刻度的宽度为20,短刻度的宽度为10

            painter.drawLine(rulerStartXVertical, rulerStartYVertical - i, rulerStartXVertical - tickWidth, rulerStartYVertical - i); // 绘制刻度线
        }



        ui->workWidget->updatePixmap1(pixmap); // 更新 workWidget 上显示的图像
        int resolutionWidth = m_resolution.width();
        int resolutionHeight = m_resolution.height();
        QPixmap pixmap(resolutionWidth, resolutionHeight);
        pixmap.fill(Qt::transparent);

        QPainter painter(&pixmap);
        painter.setPen(QPen(Qt::red, 1)); // 设置画笔颜色为红色,宽度为2



        // 绘制垂直线
        painter.drawLine(resolutionWidth / 2, 0, resolutionWidth / 2, resolutionHeight);
        // 绘制水平线
        painter.drawLine(0, resolutionHeight / 2, resolutionWidth, resolutionHeight / 2);

        int centerX = resolutionWidth / 2;
        int centerY = resolutionHeight / 2;


        QString filePath = QCoreApplication::applicationDirPath() + "/config.ini";
        QSettings settings(filePath, QSettings::IniFormat);
        double TmpPixelvalue;
        QString TmpMeasurementValue;
        if(settings.value("Pixelvalue").toDouble() != 0.0){
            TmpPixelvalue=settings.value("Pixelvalue").toDouble();
        }
        if(settings.value("MeasurementValue").toString()!=QString("")){
            TmpMeasurementValue=settings.value("MeasurementValue").toString();
        }

//    centerX = 横坐标中心原点;
//    centerY = 纵坐标中心原点;
//        // 绘制量尺
        int rulerLength = m_resolution.width(); // 量尺长度
        int tickSpacing = 5; // 刻度间距

        float Tmpscale =  tickSpacing * 10 / TmpPixelvalue;

        // 在十字中间添加值
        QString centerText = QString("%1 %2").arg(QString::number(Tmpscale, 'f', 1) ).arg(TmpMeasurementValue);
        QRectF centerRect(centerX, centerY, 100, 20); // 调整矩形区域大小为80x20,可以根据需要进行调整
        painter.drawText(centerRect, Qt::AlignCenter, centerText);

        // 绘制水平中心线上的量尺
        int rulerStartXHorizontal = centerX; // 水平量尺起始位置X坐标
        int rulerStartYHorizontal = centerY; // 水平量尺起始位置Y坐标

        for (int i = 0; i <= rulerLength/2; i += tickSpacing) {
            int tickHeight = 0;
            if (i % (tickSpacing * 10) == 0) { // 长刻度
                tickHeight = 15;
            } else if (i % (tickSpacing * 5) == 0) { // 中等刻度
                tickHeight = 10;
            } else { // 短刻度
                tickHeight = 5;
            }

            painter.drawLine(rulerStartXHorizontal + i, rulerStartYHorizontal, rulerStartXHorizontal + i, rulerStartYHorizontal - tickHeight); // 绘制刻度线
            painter.drawLine(rulerStartXHorizontal - i, rulerStartYHorizontal, rulerStartXHorizontal - i, rulerStartYHorizontal - tickHeight); // 绘制刻度线
        }

        // 绘制垂直中心线上的量尺
        int rulerStartXVertical = centerX; // 垂直量尺起始位置X坐标
        int rulerStartYVertical = centerY ; // 垂直量尺起始位置Y坐标

        for (int i = 0; i <= rulerLength /2; i += tickSpacing) {
//            int tickWidth = (i % (tickSpacing * 5) == 0) ? 20 : 10; // 长刻度的宽度为20,短刻度的宽度为10
            int tickWidth = 0;
            if (i % (tickSpacing * 10) == 0) { // 长刻度
                tickWidth = 15;
            } else if (i % (tickSpacing * 5) == 0) { // 中等刻度
                tickWidth = 10;
            } else { // 短刻度
                tickWidth = 5;
            }
            painter.drawLine(rulerStartXVertical, rulerStartYVertical - i, rulerStartXVertical - tickWidth, rulerStartYVertical - i); // 绘制刻度线
            painter.drawLine(rulerStartXVertical, rulerStartYVertical + i, rulerStartXVertical - tickWidth, rulerStartYVertical + i); // 绘制刻度线
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值