【发布时间】:2017-10-02 22:06:44
【问题描述】:
我目前正在用 Qt 开发一个小程序。要显示绘图,您可以使用 qwt 或 qcustomplot 或 qpainterevent 或 QChart。但我对使用 QGraphicsView 编写的动态绘图的解决方案感兴趣。
我的偏好 - 我的图表的宽度应该是恒定的 - 实时绘图 -如果到达图表末尾,则应删除或覆盖第一个样本,因此它是动态流畅的图表
我下面的例子可以是动态和流畅的......但只是为了数字,它在我的 if 子句中。我不明白为什么。
想法是删除第一个lineitem,所以我一直有99个item。如果我删除一个项目,我想为下一个项目提供前一个项目的位置。 所以 x=99 将 x=98 ......x=1 将 x=0;
我的想法有错误吗? 我也有几个想法,但这可能是最好的。
提前致谢 康拉德
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
vectorPoint = new QVector<QPoint>;
line = new QVector<QGraphicsLineItem*>;
yDatai = 0;
xDatai = 0;
Grenzenlaufvariable = 0;
timer = new QTimer(this);
timer->start(10);
connect (timer, SIGNAL(timeout()),this,SLOT(newData()));
connect(this,SIGNAL(newPaint()),this,SLOT(paint()));
}
MainWindow::~MainWindow()
{
delete ui;
delete scene;
delete vectorPoint;
delete line;
}
void MainWindow::newData()
{
if (yDatai == 100 || yDatai == -100)
{
Grenzenlaufvariable++;
}
if (Grenzenlaufvariable%2==0)
{
yDatai+=1;
}
else
{
yDatai-=1;
}
xDatai++;
point = {xDatai,yDatai};
vectorPoint->append(point);
if(vectorPoint->size()>1)
{
item = scene->addLine(QLineF(vectorPoint->at(ix-1),vectorPoint->at(ix)));
line->append(item);
}
ix++;
emit newPaint();
}
void MainWindow::paint()
{
if(line->size()==99)
{
scene->removeItem(line->at(0));
line->removeAt(0);
qDebug()<<line->size();
for (int ip= 0;ip <line->size();ip++)
{
oldx = line->at(ip)->x();
line->at(ip)->setX(oldx-1);
qDebug()<<ip;
}
}
}
【问题讨论】:
-
你可以更好地解释我。
-
您究竟在哪里需要更好的解释?是我想要的还是我编码的?
标签: qt plot real-time qgraphicsview qgraphicsscene