qt5 在有数据读取绘图的时候,使用鼠标绘图会有延迟
GUIWidget::GUIWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::GUIWidget)
{
image = QImage(592,550,QImage::Format_RGB32);
pix = QPixmap(592,550);
QColor backColor=qRgb(255,255,255);
image.fill(backColor);
pix.fill(Qt::transparent);
Paint();//绘制坐标
timer = new QTimer(this);
connect(timer,&QTimer::timeout,this,[=]{
if(wid_ptr!=NULL)
{
buff=wid_ptr->buffer;
arrayCut(wid_ptr->buffer,newbuf);
}
paint(newbuf); //绘图
update(); //刷新
});
timer->start(0); //300毫秒后发送timeout信号
/**************/
ui->setupUi(this);
/*******************/
}
GUIWidget::~GUIWidget()
{
delete ui;
}
/***************绘图函数*******************/
void GUIWidget::paint(float newbuf[][6])
{
QPainter p(&image);//指定当前绘画对象p
/************设置画笔参数***************/
QColor color(255,0,0);
QPen pen(color);
pen.setWidth(3);
p.setRenderHint(QPainter::Antialiasing);
/******************************************/
p.setPen(pen);
int xx=0; //记录多少个需要绘制的线段
int i=0,j=0;
for(i=0;i<64;i++)
{
if(0 != newbuf[i][0])
{
for(j=0;j<64;j++)
{
if( 0 !=oldbuf[j][0])
{
if(newbuf[i][0]==oldbuf[j][0])
if(newbuf[i][2]!=oldbuf[j][1]||newbuf[i][3]!=oldbuf[j][2])
{
{
linef[i]= QLine(296+(oldbuf[j][2]*20),550-(oldbuf[j][1]*1.5),296+(newbuf[i][3]*20),550-(newbuf[i][2]*1.5));
qDebug()<<oldbuf[j][0]<<"oldbuf"<<j<<"[1],oldbuf[j][2]"<<oldbuf[j][1]<<","<<oldbuf[j][2]<<endl;
qDebug()<<newbuf[i][0]<<"newbuf"<<i<<"[2],newbuf[i][3]"<<newbuf[i][2]<<","<<newbuf[i][3]<<endl;
qDebug()<<"*********************"<<endl;
xx++;
break;
}
}
}
else
break;
}
}
else
break;
}
p.drawLines(linef,xx);
for(i=0;i<64;i++)
{
oldbuf[i][0]=newbuf[i][0];
oldbuf[i][1]=newbuf[i][2];
oldbuf[i][2]=newbuf[i][3];
}
}
void GUIWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawImage(0,0,image);
QColor color(0,255,0);
QPen pen(color);
pen.setWidth(6);
painter.setPen(pen);
for(int i=0;i<64;i++)
{
if(0!=newbuf[i][0])
painter.drawPoint(296+newbuf[i][3]*20,550-newbuf[i][2]*1.5);
}
QPainter p(&image);
p.drawPixmap(0,0,pix);
QPainter pp(&pix);
for(int i=0; i<_lines.size(); i++)
{
//第i条线
const QVector<QPoint> &line = _lines.at(i);
//每一条线中所有的点,两两连起来,就是一条线
for(int j=0; j<line.size()-1; j++)
{
pp.drawLine(line.at(j), line.at(j+1));
}
}
}
void GUIWidget::Paint()//绘制坐标系
{
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
int pointx=296,pointy=550;
int height=550;
painter.drawLine(0,pointy,592,pointy);//坐标轴x宽度为width
painter.drawLine(pointx,pointy-height,pointx,pointy);//坐标轴y高度为height
QPen penDegree;
penDegree.setColor(Qt::black);
penDegree.setWidth(2);
painter.setPen(penDegree);
// double n=3.7;
//画上x轴刻度线
for(int i=0;i<8;i++)//分成8份
{
//选取合适的坐标,绘制一段长度为4的直线,用于表示刻度
painter.drawLine(i*3.7*20,pointy,i*3.7*20,pointy-4);
painter.drawText((i+0.65)*3.7*20,pointy-10,QString::number((int)(i+1)));
}
//y轴刻度线
double _maStep=30;//y轴刻度间隔需根据最大值来表示
for(int i=0;i<10;i++)
{
//主要就是确定一个位置,然后画一条短短的直线表示刻度。
painter.drawLine(pointx,pointy-(i+1)*height/10,
pointx-4,pointy-(i+1)*height/10);
painter.drawText(pointx-20,pointy-(i+0.85)*height/10,
QString::number((int)(_maStep*(i+1))));
}
}
- 点赞
- 写回答
- 关注问题
- 收藏
- 复制链接分享
- 邀请回答
为你推荐
- QT多线程共享数据,但线程耗时不同
- c++
- 1个回答
- QT中有没有,文件读取文件后回到文件头 类似rewind
- c++
- 1个回答
- 在QT中使用QTextStream的readline读取文本文件时,默认不设置readline参数后从第二行读取,第一行内容不能正常显示
- c++
- 1个回答
- qt 很简单的一段代码 利用Qsetting 完成,但是在读取配置文件的时候,出问题
- QT中如何实现在普通函数中完成ui数据更新
- c++有没有类似qt这种逐行读取txt文件的方式
- c++
- 2个回答
- qt按列读取txt内的数据 为什么只能读前三列 不能读之后的呢
- c++
- 1个回答
- 在qt中如何向控件传递数据库中的数据
- 请问QT中的QTableView如何实现鼠标悬停某单元格可以使用Tooltip来显示该单元格的内容呢
- qt
- 4个回答
- Qt串口通讯QSerialport接受数据失帧问题
- qt 串口通信
- 2个回答
- Qt 使用官方的组播实例程序(multicast sender example)遇到的问题
- qt5组播
- 1个回答
- 使用qt 在http协议post请求数据时,服务器端接收到的数据为空
- 服务器
- http协议
- web服务器
- qt
- 数据
- 3个回答
- Qt报错有未处理的异常?
- 异常
- widget
- qt
- 10个回答
- qt解析复杂的json的方法或者辅助插件有没有
- json
- qt
- 数据
- 6个回答
- 急,Qt使用数据库添加数据的和驱动问题问题
- qt5
- mysql
- 1个回答
- 如何使用QT将sqlite的数据读取出,并显示在ui的界面上
- 1个回答
- qt编写一个读取图像数据的插件
- 图像处理
- 插件
- vs2008
- qt
- 2个回答
- VS2012的程序如何使用QT5构建交互界面
- c++
- qt5
- 界面
- vs2012
- 2个回答
- 如何用QT来读取USB里面的内容
- usb
- qt
- 3个回答
- Qt5怎么在ListView中添加右键菜单?