Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Aggiornamento dati

Aggiornamento dati

Scheduled Pinned Locked Moved Solved Italian
22 Posts 2 Posters 3.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on last edited by
    #2

    Stai bloccando l'event loop con for(;;). In pratica Qt non puo' plottare se tu non gli dai il controllo. Devi rimuovere il loop infinito e usare signal/slot per dire a mygrafic3d quando un altro dato e' nella coda

    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
    ~Napoleon Bonaparte

    On a crusade to banish setIndexWidget() from the holy land of Qt

    1 Reply Last reply
    0
    • L Offline
      L Offline
      Lorenz_95
      wrote on last edited by
      #3

      Se ho capito bene devo eliminare la funzione consume() e al suo posto usare il signal/slot e successivamente chiamare estrai_dati() e addData()?

      Domanda la funzione addData() è corretta per plottare i dati (xpos, ypos e zpos) sul grafico ogni volta che mi arrivano?

      VRoninV 1 Reply Last reply
      0
      • L Lorenz_95

        Se ho capito bene devo eliminare la funzione consume() e al suo posto usare il signal/slot e successivamente chiamare estrai_dati() e addData()?

        Domanda la funzione addData() è corretta per plottare i dati (xpos, ypos e zpos) sul grafico ogni volta che mi arrivano?

        VRoninV Offline
        VRoninV Offline
        VRonin
        wrote on last edited by
        #4

        @Lorenz_95 said in Aggiornamento dati:

        Se ho capito bene devo eliminare la funzione consume() e al suo posto usare il signal/slot e successivamente chiamare estrai_dati() e addData()?

        Corretto

        Domanda la funzione addData() è corretta per plottare i dati (xpos, ypos e zpos) sul grafico ogni volta che mi arrivano?

        si e no. E giusto il concetto ma non l'esecuzione. Tu al momento crei un nuovo array ogni volta, imposti l'ultimo valore (lasciando gli altri non definiti) e poi lo rimetti dentro al grafico. Quello che dovresti fare invece e' estrarre l'array vecchio (m_series->dataProxy()->array()) e aggiungere a quello il nuovo dato e poi chiamare resetArray

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        1 Reply Last reply
        0
        • L Offline
          L Offline
          Lorenz_95
          wrote on last edited by
          #5

          Quindi l'array lo imposto una volta prima della chiamata di addData() e poi inserisco i nuovi valori. Se ho capito bene il codice lo devo modificare così?

          // Prima della chiamata di addData
          m_array = new QScatterDataArray;
          
          //funzione addData    
          void mygrafic3d::addData()
          {
          	int arraysize = 100;
              if (arraysize != m_array->size())
                  m_array->resize(arraysize);
          
          	QScatterDataItem *ptrToDataArray = &m_array->first();
          	
          	m_series->dataProxy()->array();
          
              ptrToDataArray->setPosition(QVector3D(xpos, ypos, zpos));
              ptrToDataArray++;
          
              m_series->dataProxy()->resetArray(m_array);
          }
          
          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by VRonin
            #6

            quasi.

            // 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 );
            }
            

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            L 1 Reply Last reply
            0
            • L Offline
              L Offline
              Lorenz_95
              wrote on last edited by
              #7

              Grazie mille, vi farò sapere se funziona.
              Ultima cosa per il signal/slot (visto che non l ho mai usato) è sufficiente usare QObject :: connect()?

              1 Reply Last reply
              0
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by
                #8

                Si, connect() e' il ponte tra il signal e lo slot

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                1
                • L Offline
                  L Offline
                  Lorenz_95
                  wrote on last edited by
                  #9

                  Quindi ogni volta che mi arriva un dato eseguo la connect() che passa il dato al codice scritto all'inizio del topic e affinché venga letto da mygrafic3d::mygrafic3d(Q3DScatter *scatter) devo aggiungere un altra funzione?

                  VRoninV 1 Reply Last reply
                  0
                  • L Lorenz_95

                    Quindi ogni volta che mi arriva un dato eseguo la connect() che passa il dato al codice scritto all'inizio del topic e affinché venga letto da mygrafic3d::mygrafic3d(Q3DScatter *scatter) devo aggiungere un altra funzione?

                    VRoninV Offline
                    VRoninV Offline
                    VRonin
                    wrote on last edited by
                    #10

                    @Lorenz_95 said in Aggiornamento dati:

                    Quindi ogni volta che mi arriva un dato eseguo la connect()

                    No.
                    connect va chiamato una volta sola. crea un ponte tra un segnale e uno slot. in pratica connect dice "quando succede X fai Y". Ogni volta che ricevi un dato devi emettere un segnale (X) e in automatico verra' chiamato Y

                    https://doc.qt.io/qt-5/signalsandslots.html

                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                    ~Napoleon Bonaparte

                    On a crusade to banish setIndexWidget() from the holy land of Qt

                    1 Reply Last reply
                    0
                    • L Offline
                      L Offline
                      Lorenz_95
                      wrote on last edited by Lorenz_95
                      #11

                      Quindi connect() viene chiamata nella classe dove eseguo le modifiche del dato che cambia. Nel mio caso la sostituisco al posto di consume().
                      Dovrei usarla così nel mio caso? Dove "mykeypass" è un QByteArray mentre "cambiadato" è il segnale che viene emesso quando cambia il valore di "mykeypass" e sono entrambi definiti nella classe dove cambia il dato.

                      connect(mykeypass, SIGNAL(cambiadato(const QByteArray &)), this, SLOT(estrai_dati(const QByteArray &)));
                      1 Reply Last reply
                      0
                      • VRoninV Offline
                        VRoninV Offline
                        VRonin
                        wrote on last edited by
                        #12

                        connect(this, SIGNAL(cambiadato(const QByteArray &)), this, SLOT(estrai_dati(const QByteArray &)));

                        il primo argomento deve essere un puntatore all'oggetto che emette il segnale

                        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                        ~Napoleon Bonaparte

                        On a crusade to banish setIndexWidget() from the holy land of Qt

                        1 Reply Last reply
                        0
                        • L Offline
                          L Offline
                          Lorenz_95
                          wrote on last edited by
                          #13

                          ok, ho guardato degli esempi e adesso mi è più chiaro come funziona.
                          Infine quando chiamo void mygrafic3d::estrai_dati(const QByteArray &stringa) in "stringa" ho il valore che è cambiato dopo aver emesso il segnale "cambiadato" corretto?

                          1 Reply Last reply
                          0
                          • VRoninV VRonin

                            quasi.

                            // 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 );
                            }
                            
                            L Offline
                            L Offline
                            Lorenz_95
                            wrote on last edited by VRonin
                            #14

                            @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?

                            1 Reply Last reply
                            0
                            • VRoninV Offline
                              VRoninV Offline
                              VRonin
                              wrote on last edited by
                              #15

                              no, e' solo un problema di constness:

                              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 );
                              }
                              

                              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                              ~Napoleon Bonaparte

                              On a crusade to banish setIndexWidget() from the holy land of Qt

                              1 Reply Last reply
                              0
                              • L Offline
                                L Offline
                                Lorenz_95
                                wrote on last edited by
                                #16
                                #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 la connect() perchè non l avevo mai usata prima, potreste dargli un occhio?

                                1 Reply Last reply
                                0
                                • VRoninV Offline
                                  VRoninV Offline
                                  VRonin
                                  wrote on last edited by VRonin
                                  #17

                                  usa la connect di Qt5 cosi' non rischi typos. ServerClass qui e' il tipo di server.

                                  connect(&server, &ServerClass::Signal_Data, this, &mygrafic3d::slot_data);

                                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                  ~Napoleon Bonaparte

                                  On a crusade to banish setIndexWidget() from the holy land of Qt

                                  1 Reply Last reply
                                  0
                                  • L Offline
                                    L Offline
                                    Lorenz_95
                                    wrote on last edited by
                                    #18
                                    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()?

                                    1 Reply Last reply
                                    0
                                    • VRoninV Offline
                                      VRoninV Offline
                                      VRonin
                                      wrote on last edited by
                                      #19

                                      resetArray emette il segnale QScatterDataProxy::arrayReset che il grafico riceve e sa che deve aggiornarsi

                                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                      ~Napoleon Bonaparte

                                      On a crusade to banish setIndexWidget() from the holy land of Qt

                                      1 Reply Last reply
                                      0
                                      • L Offline
                                        L Offline
                                        Lorenz_95
                                        wrote on last edited by Lorenz_95
                                        #20
                                        This post is deleted!
                                        VRoninV 1 Reply Last reply
                                        0
                                        • L Lorenz_95

                                          This post is deleted!

                                          VRoninV Offline
                                          VRoninV Offline
                                          VRonin
                                          wrote on last edited by
                                          #21

                                          @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

                                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                          ~Napoleon Bonaparte

                                          On a crusade to banish setIndexWidget() from the holy land of Qt

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved