Aggiornamento dati
-
@VRonin said in Aggiornamento dati:
// Prima della chiamata di addData
m_series->dataProxy()->resetArray( new QScatterDataArray);void mygrafic3d::addData()
{
QScatterDataArray* array = m_series->dataProxy()->array();
array->append(QScatterDataItem(QVector3D(xpos, ypos, zpos)));
m_series->dataProxy()->resetArray(array );
}Il compilatore mi da errore in questa funzione, dicendo che:
*****"error: cannot initialize a variable of type 'QtDataVisualization::QScatterDataArray *' (aka 'QVector<QtDataVisualization::QScatterDataItem> *') with an rvalue of type 'const QtDataVisualization::QScatterDataArray *' (aka 'const QVector<QtDataVisualization::QScatterDataItem> *')"***** **error: invalid conversion from 'const QScatterDataArray* {aka const QVector<QtDataVisualization::QScatterDataItem>*}' to 'QtDataVisualization::QScatterDataArray* {aka QVector<QtDataVisualization::QScatterDataItem>*}' [-fpermissive] QScatterDataArray *array = m_series->dataProxy()->array(); ^**
Io nel file .h ho già definito
private: QScatterDataArray *m_array;
questo può essere causa dell errore? Come modifico il codice che mi hai scritto? -
no, e' solo un problema di
const
ness:void mygrafic3d::addData() { QScatterDataArray* array = new QScatterDataArray(*m_series->dataProxy()->array()); m_series->dataProxy()->resetArray(Q_NULLPTR); array->append(QScatterDataItem(QVector3D(xpos, ypos, zpos))); m_series->dataProxy()->resetArray(array ); }
-
#include <QtDataVisualization> #include <QtWidgets> #include <QDialog> #include <QtCore> #include <QObject> #include <stdio.h> #include <stdlib.h> #include "mygrafic3d.h" #include "myserver.h" using namespace QtDataVisualization; mygrafic3d::mygrafic3d(Q3DScatter *scatter) : m_graph(scatter), m_fontSize(40.0f), m_style(QAbstract3DSeries::MeshSphere), m_smooth(true), m_series(new QScatter3DSeries)/*, m_array(new QScatterDataArray)*/ { //Modifiche visive m_graph->activeTheme()->setType(Q3DTheme::ThemeQt); QFont font = m_graph->activeTheme()->font(); font.setPointSize(m_fontSize); m_graph->activeTheme()->setFont(font); m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftLow); m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront); m_graph->axisX()->setTitle("X"); m_graph->axisY()->setTitle("Y"); m_graph->axisZ()->setTitle("Z"); m_graph->axisX()->setTitleVisible(true); m_graph->axisY()->setTitleVisible(true); m_graph->axisZ()->setTitleVisible(true); //creo un QScatterDataProxy e il QScatter3DSeries associato QScatterDataProxy *proxy = new QScatterDataProxy; m_series = new QScatter3DSeries(proxy); m_series->setItemLabelFormat(QStringLiteral("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel")); m_series->setMeshSmooth(m_smooth); m_graph->addSeries(m_series); // Prima della chiamata di addData m_series->dataProxy()->resetArray(new QScatterDataArray); connect(&server, SIGNAL(Signal_Data(const QByteArray &)), this, SLOT(slot_data(const QByteArray &))); qDebug() << "segnale ricevuto"; } mygrafic3d::~mygrafic3d() { delete m_graph; } void mygrafic3d::slot_data(const QByteArray &stringa) { strcpy(dato, stringa); qDebug()<< "Valore dato: " << dato; estrai_dati(); addData(); } void mygrafic3d::addData() { QScatterDataArray* array = new QScatterDataArray(*m_series->dataProxy()->array()); m_series->dataProxy()->resetArray(Q_NULLPTR); array->append(QScatterDataItem(QVector3D(xpos, ypos, zpos))); m_series->dataProxy()->resetArray(array); }
In definitiva quello che ho scritto adesso è questo, dovrebbe essere tutto corretto.
Il mio unico dubbio è se ho scritto correttamente laconnect()
perchè non l avevo mai usata prima, potreste dargli un occhio? -
usa la connect di Qt5 cosi' non rischi typos.
ServerClass
qui e' il tipo diserver
.connect(&server, &ServerClass::Signal_Data, this, &mygrafic3d::slot_data);
-
void mygrafic3d::addData() { QScatterDataArray* array = new QScatterDataArray(*m_series->dataProxy()->array()); m_series->dataProxy()->resetArray(Q_NULLPTR); array->append(QScatterDataItem(QVector3D(xpos, ypos, zpos))); m_series->dataProxy()->resetArray(array ); }
Ma in questa funzione non manca una funzione per plottare i dati sul grafico? Come ad esempio
addSeries()
? -
@Lorenz_95 said in Aggiornamento dati:
Avete idea di quale possa essere il problema?
Identico a quello di prima:
@VRonin said in Aggiornamento dati:Stai bloccando l'event loop
Nel codice che hai postato il pezzo piu' sospetto e':
//aspetto che venga emesso nel client il segnale readyRead() if (socket->waitForReadyRead(3000))
Mentre aspetti il grafico non puo' aggiornarsi. Se hai un loop infinito attorno a quel pezzo di codice il grafico non ha mai il tempo di aggiornarsi perche' stai occupando il thread con altre operazioni. Invece di fare un loop infinito e aspettare un segnale semplicemente connetti il segnale allo slot che esegue le operazioni