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
Forum Updated to NodeBB v4.3 + New Features

Aggiornamento dati

Scheduled Pinned Locked Moved Solved Italian
22 Posts 2 Posters 5.5k 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 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
                                  • L Offline
                                    L Offline
                                    Lorenz_95
                                    wrote on last edited by
                                    #22

                                    Risolto!
                                    Il problema stava proprio in quel codice perchè era messo al interno di un loop infinito, adesso il programma funziona.
                                    Grazie mille per l'aiuto

                                    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