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 Update on Monday, May 27th 2025

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.
  • 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