前言
本期博文介绍一个热成像demo,可以对plc获取到的各个点温度在QT中进行展示成像,目前demo已经上传,已经测试通过,内含源码和exe文件,可以直接使用,也可以访问红外测试demo.zip下载。针对demo的高斯处理强化,在博文【QT】高斯处理后的图像生成工具类(2)进行了介绍,提供了封装后的源码,可以直接使用。
效果展示


功能实现
在功能实现过程中,主要是基于各个色阶,以QPainter进行各点绘制,没有涉及高斯等平滑处理,如有需求,可以查看【QT】高斯处理后的图像生成工具类(2)。
QPainter介绍
QPainter是Qt中的一个绘图对象,用于绘制各种图形、文本和图像。它提供了绘制直线、多边形、椭圆、文本、图像等各种功能。
QPainter的使用通常涉及以下步骤:
- 创建一个QPainter对象,并将其与需要绘制的设备(如QWidget、QImage等)关联。
- 使用绘图函数(如drawLine()、drawRect()、drawEllipse()等)来绘制不同的图形。
- 根据需要,设置绘制属性,如画笔的颜色、线条的粗细等。
- 绘制完成后,将绘制结果刷新到设备上(如通过调用update()函数来更新部分区域)。
以下是一些常用的QPainter绘图函数:
- drawPoint():绘制一个点
- drawLine():绘制一条直线
- drawRect():绘制一个矩形
- drawEllipse():绘制一个椭圆
- drawPolygon():绘制一个多边形
- drawText():绘制文本
- drawImage():绘制图像
在绘制之前,可以通过设置QPen和QBrush来定义画笔和填充样式,例如设置画笔颜色、线条样式、填充颜色等。可以通过以下函数来设置这些属性:
- setPen():设置画笔属性
- setBrush():设置填充样式
QPainter还提供了一些其他功能,如渐变填充、裁剪区域、图像变换等。
总的来说,QPainter是Qt中用于图形绘制的一种方便、灵活的工具,它可以通过简单的函数调用来绘制各种图形和图像,使得界面美化和数据可视化变得更加容易和高效。
部分代码展示
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QMessageBox>
#include <QFile>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ini();
//this->setFixedSize(320,320);
}
MainWindow::~MainWindow()
{
delete ui;
}
//系统自动刷新
void MainWindow::paintEvent(QPaintEvent *)
{
if(go){
go=false;//必须加这里,因为手动更新,更次次数不限定
if(getData()){
// 创建一个 QImage 对象
QImage image(32, 32, QImage::Format_RGB32);
QRgb value;
// 改变指定区域的像素点的值
for(int i=0;i<32;i++){
for(int j=0;j<32;j++){
QString realData=data.at(i).at(j);
int ratio=realData.toInt();
QStringList rgb=colorList.at(ratio);
QString redTemp =rgb.at(0);
QString greenTemp=rgb.at(1);
QString blueTemp =rgb.at(2);
uint red = redTemp.toInt();
uint green = greenTemp.toInt();
uint blue = blueTemp.toInt();
value = qRgb(red, green, blue);
image.setPixel(i, j, value); // 设置每个像素点的值
}
}
QPainter painter1(this);
//实现整体旋转
painter1.translate(160,160); //让图片的中心作为旋转的中心
painter1.rotate(90); //顺时针旋转90度
painter1.translate(-160,-160); //使原点复原
// 将图像绘制到窗口中
painter1.drawImage(0, 0, image.scaled(320,320, Qt::KeepAspectRatio));
}else{
QMessageBox::information(NULL,"提示","存在数据大于最大值,或小于最大值");
}
}else{
//不执行
}
}
//处理数据
bool MainWindow::getData(){
//数据预处理
QString content=ui->data->toPlainText();
QStringList strTemp=content.split(" ");
QStringList str;//正式数据集
for(int j=0;j<strTemp.count();j++){
if(strTemp.at(j) !=""){
str <<strTemp.at(j);
}
}
qDebug() <<"数量"<<str.count();
//正式处理
data.clear();
max=ui->HighT->toPlainText().toFloat();
min=ui->lowT->toPlainText().toFloat();
qDebug() <<max<<min;
QStringList temp;
for(int i=0;i<str.count()/2;i++){
QString hexstr1 = str[i*2];
QString hexstr = str[i*2+1];
bool ok;
quint16 tempData = ((hexstr1.toInt(&ok,16)&0x00FF)<<8) + hexstr.toInt(&ok,16);
float num=(tempData - 2731)/10.0;
if((num>max)||(num<min)){
return false;
}
int radio=(num-min)/(max-min)*(pow-1);
temp << QString::number(radio);
if(((i+1)%32==0)&&(i!=0)){
data <<temp;
temp.clear();
}
}
return true;
qDebug() <<"数据处理完成"<<str.count();
//deal(ui->data->toPlainText());
// data <<deal("0B 89 0B 90 0B 8B 0B 96 0B 8D 0B 8E 0B 8E 0B 9C 0B 9F 0B 95 0B 9E 0B 98 0B A2 0B BC 0B BC 0B B1 0B BD 0B C6 0B C6 0B B6 0B C3 0B AF 0B 9D 0B A8 0B A3 0B AC 0B 9F 0B 96 0B 93 0B 8D 0B 94 0B 89");
// data <<deal("0B 8A 0B A3 0B 89 0B 89 0B 7C 0B A1 0B A0 0B A1 0B A1 0B 84 0B 9B 0B AE 0B B1 0B D3 0B D2 0B BA 0B C4 0B CF 0B CA 0B C2 0B BD 0B A4 0B AB 0B 9F 0B 90 0B 8C 0B 82 0B 9F 0B 9D 0B 86 0B 92 0B 72");
// data <<deal("0B 7F 0B 80 0B A2 0B 92 0B 90 0B 89 0B 8C 0B 92 0B A6 0B B0 0B A9 0B CA 0B B3 0B D5 0B D9 0B D7 0B CC 0B CD 0B CA 0B CF 0B D3 0B C1 0B CB 0B B3 0B A5 0B AB 0B 8C 0B 98 0B 92 0B 96 0B 9A 0B 8E");
// data <<deal("0B 8E 0B 93 0B 92 0B 8E 0B 69 0B 8F 0B 97 0B 97 0B A7 0B A3 0B C7 0B D2 0B E4 0B D5 0B E4 0B C9 0B DE 0B E9 0B ED 0B D4 0B DE 0B D5 0B C0 0B CA 0B B6 0B AB 0B B0 0B 91 0B A9 0B 9A 0B 9C 0B 9B");
// data <<deal("0B A4 0B A1 0B 89 0B 81 0B 72 0B 93 0B 99 0B 94 0B A8 0B C2 0B DD 0B EF 0B F4 0B FE 0C 10 0C 0D 0B F6 0B ED 0C 09 0C 01 0B F3 0B DE 0B D3 0B C6 0B C6 0B B9 0B 96 0B 96 0B 87 0B 96 0B 8B 0B A6");
// data <<deal("0B 90 0B A8 0B 95 0B 8E 0B 8B 0B 96 0B 95 0B AB 0B A9 0B BD 0B E3 0B FE 0C 0C 0C 0A 0C 01 0C 0A 0C 05 0C 07 0C 09 0B F4 0B DE 0B E9 0B F6 0B CE 0B CF 0B C3 0B A6 0B 98 0B 94 0B 9B 0B 8E 0B 96");
// data <<deal("0B 98 0B 93 0B 92 0B 8C 0B 9E 0B 90 0B A6 0B A3 0B B6 0B E6 0B FE 0B FD 0B DD 0C 08 0C 0B 0B FE 0C 10 0C 07 0C 0F 0C 04 0B FD 0C 0B 0C 02 0B DB 0B DA 0B C7 0B A9 0B A8 0B 93 0B 94 0B 92 0B 91");
// data <<deal("0B 93 0B 8D 0B 87 0B 93 0B 7A 0B 9F 0B AC 0B 9E 0B DB 0B F0 0B FD 0C 08 0B FE 0B F6 0C 09 0B DD 0B FD 0C 0C 0C 0D 0C 0C 0C 06 0B FF 0C 0A 0B F7 0B E7 0B D6 0C 47 0B A1 0B 9F 0B 97 0B 97 0B A0");
// data <<deal("0B A3 0B AA 0B 9D 0B 9D 0B 97 0B 8A 0B A4 0B B9 0B E9 0B FE 0B F8 0C 00 0C 00 0C 02 0C 0A 0C 07 0C 04 0C 12 0C 0A 0C 08 0C 0D 0C 0A 0C 0C 0C 0A 0B F7 0B DA 0B C1 0B A0 0B 8E 0B A2 0B 94 0B 93");
// data <<deal("0B 92 0B 98 0B A7 0B AA 0B 93 0B 9E 0B 9E 0B B0 0B E4 0B E9 0C 08 0C 04 0C 00 0C 0B 0C 08 0C 07 0C 0A 0C 07 0C 07 0B FD 0B F5 0C 06 0B F3 0C 05 0B FF 0B F0 0B C1 0B A5 0B 9A 0B 8D 0B 8A 0B 8A");
// data <<deal("0B 97 0B A3 0B A9 0B C1 0B 84 0B 97 0B A3 0B A1 0B EA 0B FC 0C 05 0B FA 0B D1 0C 01 0C 0B 0C 0C 0C 23 0C 0C 0C 08 0B F8 0C 00 0C 0B 0C 0D 0B FD 0C 03 0B EE 0B BB 0B AD 0B 93 0B 92 0B 9A 0B 97");
// data <<deal("0B A4 0B 91 0B A1 0B B9 0B 81 0B 8C 0B 93 0B A8 0B AF 0B C4 0B F3 0B FE 0C 05 0B F7 0B FD 0B E2 0B E9 0C 06 0C 15 0C 01 0B FF 0B F1 0B FD 0C 01 0C 0D 0B EE 0B BE 0B A9 0B A3 0B 94 0B 92 0B 79");
// data <<deal("0B 97 0B 99 0B 8A 0B 8D 0B 93 0B 94 0B 8E 0B 9D 0B DD 0C 01 0B FE 0C 04 0C 08 0C 09 0C 08 0C 00 0C 05 0C 03 0C 0A 0C 08 0C 06 0B F5 0C 03 0B F8 0C 01 0B EE 0B B9 0B 9B 0B 8F 0B 95 0B 9A 0B A2");
// data <<deal("0B 94 0B 9F 0B 9B 0B 8A 0B 96 0B 9F 0B 9B 0B AC 0B EA 0B E9 0B F8 0C 00 0C 01 0C 04 0C 05 0B F3 0B FD 0C 02 0B EF 0B FB 0B FB 0B FA 0B FC 0B F7 0B FF 0B FC 0B AB 0B 9C 0B 91 0B 9C 0B 9B 0B 9B");
// data <<deal("0B 8F 0B 8D 0B A3 0B 8C 0B 87 0B 9D 0B 93 0B 97 0B F4 0C 03 0B FB 0B FC 0B D5 0C 02 0C 04 0B F3 0C 14 0B E6 0B F7 0B F7 0B F9 0B FC 0C 0A 0C 04 0B F4 0B ED 0B C7 0B 9A 0B 8B 0B 9D 0B 85 0B 95");
// data <<deal("0B 97 0B 8C 0B 8F 0B 9A 0B 91 0B 91 0B A6 0B 97 0B E9 0C 0A 0C 06 0B FC 0C 01 0C 02 0C 03 0B DC 0B E2 0B FE 0C 02 0C 02 0C 0C 0B F5 0C 07 0B FB 0B FD 0B FB 0B E2 0B 95 0B 9E 0B 9F 0B 90 0B 94");
// data <<deal("0B 9A 0B 8B 0B 9C 0B 8D 0B 82 0B 89 0B A4 0B A4 0B DF 0B FB 0B F9 0B F6 0B FE 0C 05 0C 06 0B F9 0B FA 0B F7 0B FE 0C 01 0B FE 0B F1 0B F3 0B F5 0B F8 0B E4 0B D3 0B 96 0B AD 0B 89 0B BC 0B 9C");
// data <<deal("0B 96 0B 9B 0B 8E 0B 81 0B 96 0B 95 0B 83 0B A3 0B D6 0B FD 0C 03 0C 05 0C 05 0C 02 0C 02 0B F8 0C 05 0B FB 0B F8 0C 16 0C 0A 0B EF 0C 03 0B F5 0B E1 0B F3 0B BE 0B 9B 0B AA 0B A0 0B 99 0B 97");
// data <<deal("0B 9E 0B 94 0B 9D 0B 97 0B 94 0B 92 0B 9C 0B 98 0B DC 0C 01 0C 01 0C 01 0B FE 0C 02 0C 05 0B F3 0B FE 0B F8 0B F7 0C 04 0C 0E 0C 05 0B FE 0B EA 0B FD 0B E2 0B AD 0B A3 0B A2 0B 9B 0B 89 0B 97");
// data <<deal("0B 72 0B 8A 0B AC 0B 99 0B 91 0B 8F 0B 89 0B 95 0B D3 0B F7 0C 1A 0B F3 0C 05 0B F3 0C 0C 0C 09 0B FF 0B FE 0C 08 0C 08 0C 06 0B F8 0B F1 0B F3 0B E9 0C 83 0A F9 0B 9D 0B A3 0B A4 0B AD 0B B6");
// data <<deal("0B 8F 0B 85 0B 9A 0B 98 0B 98 0B A0 0B A1 0B AD 0B AA 0B EF 0B FB 0B FA 0C 05 0B F4 0C 05 0B FB 0C 07 0B F3 0C 0A 0C 01 0C 0B 0C 08 0B F7 0B F6 0B D4 0B 92 0B 9D 0B 95 0B AA 0B AD 0B C8 0B AE");
// data <<deal("0B 97 0B 98 0B 9E 0B 89 0B 96 0B 9E 0B AD 0B A7 0B A9 0B FB 0B FD 0C 0A 0C 01 0B FB 0C 01 0C 00 0C 00 0C 00 0C 03 0C 0D 0C 05 0B F5 0B EF 0B F1 0B B4 0B A6 0B A1 0B A1 0B B0 0B A4 0B AE 0B A6");
// data <<deal("0B 97 0B 8D 0B 9D 0B 94 0B A2 0B A0 0B B4 0B 9F 0B A5 0B D0 0B F9 0B F1 0C 0A 0B F8 0C 01 0C 00 0B FF 0C 14 0B F8 0C 04 0C 02 0B FD 0B F3 0B DC 0B B0 0B A8 0B 9E 0B 9A 0B A0 0B A3 0B 8B 0B 95");
// data <<deal("0B 86 0B 90 0B AE 0B 9C 0B 9B 0B 8D 0B 93 0B 95 0B 94 0B A7 0B F9 0B FE 0C 08 0C 0C 0C 0C 0C 0A 0B F8 0C 0F 0C 07 0C 0A 0C 07 0B F8 0B E9 0B E2 0B A8 0B A3 0B 9F 0B 9D 0B 98 0B 83 0B 9D 0B 97");
// data <<deal("0B 8E 0B 97 0B 90 0B 92 0B 8D 0B 87 0B AE 0B A4 0B 8B 0B 9E 0B BE 0B F9 0B FC 0B F5 0B FB 0B ED 0C 05 0C 02 0C 03 0C 00 0B FA 0C 04 0B E1 0B B7 0B 99 0B 9C 0B 9A 0B 91 0B 84 0B 9D 0B B9 0B 93");
// data <<deal("0B 92 0B 85 0B 91 0B 83 0B 99 0B 98 0B 99 0B A3 0B 97 0B A2 0B BA 0B F3 0C 03 0B FA 0C 03 0C 04 0C 13 0C 04 0C 07 0C 04 0B FD 0B F8 0B F3 0B C1 0B 96 0B 90 0B A4 0B 9C 0B AE 0B 9B 0B 9E 0B 90");
// data <<deal("0B 9F 0B 86 0B A5 0B 99 0B 93 0B 88 0B AC 0B 94 0B 9D 0B B7 0B D3 0B EE 0C 02 0C 02 0B FF 0B EA 0B F8 0B F3 0B FE 0C 03 0B FD 0B FF 0B FF 0B CA 0B C6 0B B1 0B 9E 0B 9C 0B 9D 0B 9C 0B 97 0B 8F");
// data <<deal("0B 88 0B 8A 0B A0 0B AB 0B BD 0B C5 0B BD 0B CA 0B C8 0B D1 0C 10 0B F1 0B FD 0B FC 0C 0C 0C 00 0B FD 0B F2 0C 04 0B FF 0B FD 0C 0A 0B EB 0B DE 0B DD 0B D5 0B CF 0B C9 0B B6 0B B6 0B C2 0B 9C");
// data <<deal("0B AD 0B B6 0B C5 0B CD 0B D1 0B D3 0B CA 0B D3 0B D9 0B D5 0B F2 0C 01 0C 0C 0C 00 0B EF 0B F2 0B FF 0B FD 0B F7 0C 01 0B FE 0B EB 0B F0 0B E7 0B F6 0B C6 0B D0 0B D4 0B CC 0B B6 0B D1 0B D3");
// data <<deal("0B CF 0B B8 0B C5 0B D6 0B D6 0B DC 0B D9 0B DF 0B E6 0B DC 0B FC 0C 0F 0C 04 0B F5 0C 04 0B F4 0B E6 0B F9 0B ED 0C 0E 0B EC 0B E4 0B EB 0B E3 0B E3 0B DE 0B EF 0B CC 0B CA 0B CD 0B C4 0B D3");
// data <<deal("0B CD 0B C3 0B D0 0B DA 0B D4 0B E2 0B C5 0B DB 0B E1 0B DE 0B DC 0B D9 0B FF 0C 0A 0B F0 0B E3 0B F1 0B F1 0B E5 0B DB 0B ED 0B E7 0B FE 0B DF 0B DE 0B F2 0B E9 0B E2 0B DE 0B D7 0B C7 0B D0");
// data <<deal("0B C6 0B CC 0B E2 0B DD 0B E2 0B C2 0B DE 0B DD 0B F7 0B F0 0B FC 0B D1 0B DE 0B E2 0B EA 0B EC 0B E2 0B F1 0B DB 0B EE 0B EC 0B DF 0B DF 0B E4 0B F0 0B DE 0B EB 0B E7 0B CD 0B D1 0B D9 0B E0");
}
//初始化
void MainWindow::ini(){
//根据线性渐变色条得到颜色表
// QColor orangeColor = QRgb("#FFA500");
// QColor purpleColor = QRgb("#ff00ff");
colorList;//画板
QLinearGradient linear=QLinearGradient(QPoint(0,0),QPoint(pow-1,0));
//linear.setColorAt(0, purpleColor);
//linear.setColorAt(0.17, Qt::blue);
//linear.setColorAt(0.34, Qt::cyan);
// linear.setColorAt(0.51, Qt::green);
// linear.setColorAt(0.68, Qt::yellow);
//linear.setColorAt(0.85, orangeColor);
//linear.setColorAt(1, Qt::red);
linear.setColorAt(0, Qt::green);
linear.setColorAt(0.5, Qt::yellow);
linear.setColorAt(1, Qt::red);
//把渐变色绘制到Img方便取颜色
QImage img(pow,1,QImage::Format_ARGB32);
QPainter painter(&img);
painter.fillRect(img.rect(),linear);
QStringList temp;
for(quint32 i=0;i<pow;i++){
//colorList << QString::number(img.pixel(i,0)&0x00FFFFFF,16);
QColor color=img.pixel(i,0);
temp << QString::number(color.red()) << QString::number(color.green())<< QString::number(color.blue());
colorList <<temp;
temp.clear();
//qDebug() << color.red() <<color.green()<<color.blue()<<"\n";
}
}
QStringList MainWindow::deal(QString data){
QStringList temp;
QStringList str= data.split(" ");
for(int i=0;i<str.count()/2;i++){
QString hexstr1 = str[i*2];
QString hexstr = str[i*2+1];
bool ok;
quint16 tempData = ((hexstr1.toInt(&ok,16)&0x00FF)<<8) + hexstr.toInt(&ok,16);
float num=(tempData - 2731)/10.0;
int radio=(num-min)/(max-min)*(pow-1);
// if(num>max){
// max=num;
// }
// if(num<min){
// min=num;
// }
//temp << QString::number((num-min)/(max-min)*255,'f',1);//获取圆心的alpha通道,在Qt中255表示完全不透明,0表示完全透明
temp << QString::number(radio);
}
return temp;
}
//生成随机数
float MainWindow::generateRand(float min, float max)
{
// static bool seedStatus;
// if (!seedStatus)
// {
// qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
// seedStatus = true;
// }
// if(min>max)
// {
// float temp=min;
// min=max;
// max=temp;
// }
// double diff = fabs(max-min);
// double m1=(double)(qrand()%100)/100;
// double retval=min+m1*diff;
// return retval;
}
void MainWindow::on_pushButton_clicked()
{
if((ui->HighT->toPlainText().length()>0)&&(ui->lowT->toPlainText().length()>0)&&(ui->data->toPlainText().length()>0)){
go=true;
this->update();//手动更新,更次次数不限定
}
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWidget>
#include <QPainter>
#include <QFont>
#include <QBrush>
#include <QColor>
#include <QPaintDevice>
#include <QPaintEngine>
#include <QPixmap>
#include <QPainterPath>
#include <QDebug>
#include <QLCDNumber>
#include <QRect>
#include <QRectF>
#include <QPoint>
#include <QPointF>
#include <QLabel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QList<QStringList> data;
QList<QStringList> colorList;//画板
protected:
void paintEvent(QPaintEvent *event);
bool getData();
void ini();
QStringList deal(QString a);
float generateRand(float min, float max);
// float max=60.0;
// float min=0;
// float max=47.2;
// float min=7.75;
float max;
float min;
int pow=10000;
int count=0;
bool go=false;
private slots:
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1363</width>
<height>717</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>170</x>
<y>600</y>
<width>111</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>最高温度</string>
</property>
</widget>
<widget class="QTextEdit" name="HighT">
<property name="geometry">
<rect>
<x>300</x>
<y>600</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>470</x>
<y>600</y>
<width>101</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>最低温度</string>
</property>
</widget>
<widget class="QTextEdit" name="lowT">
<property name="geometry">
<rect>
<x>640</x>
<y>600</y>
<width>131</width>
<height>51</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>800</x>
<y>580</y>
<width>191</width>
<height>71</height>
</rect>
</property>
<property name="text">
<string>生成</string>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>1000</x>
<y>40</y>
<width>101</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>数据填写</string>
</property>
</widget>
<widget class="QTextEdit" name="data">
<property name="geometry">
<rect>
<x>1010</x>
<y>100</y>
<width>311</width>
<height>411</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
</font>
</property>
</widget>
<widget class="QTextEdit" name="textEdit">
<property name="geometry">
<rect>
<x>1020</x>
<y>540</y>
<width>301</width>
<height>171</height>
</rect>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="html">
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'SimSun'; font-size:14pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">软件说明:</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1.每个字节间必须至少有一个空格</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2.点击可以实时更新</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3.如果有数据不在最高温和最低温之间,会报提示</p></body></html></string>
</property>
</widget>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
该博客介绍了如何使用QT创建一个热成像Demo,展示从PLC获取的温度数据。通过QPainter在界面上绘制图像,实现了对不同色阶的点进行绘制,同时提供了数据预处理和高斯处理的工具类。代码示例展示了数据读取、处理和图像绘制的完整流程,包括图像旋转和缩放功能。
1074

被折叠的 条评论
为什么被折叠?



