Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Ritorno dati da QDialog
QtWS25 Last Chance

Ritorno dati da QDialog

Scheduled Pinned Locked Moved Solved Italian
7 Posts 2 Posters 2.1k 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.
  • B Offline
    B Offline
    Bruschetta
    wrote on last edited by Bruschetta
    #1

    Salve a tutti, sto cercando di passare i parametri da un Dialog all'altro e spulciando internet ho trovato la seguente soluzione che però a me non funziona..
    Spreste dirmi perchè o come dovrei passare questi parametri?
    Presupponiamo che io abbia un dialog contenete i dati di una commessa e che voglia popolare alcuni campi riguardanti un cliente aprendo un altro dialog.
    Vediamo un esempio di codice:
    commessa.h

    #ifndef COMMESSA_H
    #define COMMESSA_H
    
    #include <QDialog>
    #include <listacliente.h>
    
    
    namespace Ui {
    class commessa;
    }
    
    class commessa : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit commessa(QWidget *parent = 0);
    
        ~commessa();
    
    private slots:
    
        void on_findCliente_clicked();
    
    private:
        Ui::commessa *ui;
        void stampaStringhe (QString Opt1, QString Opt2, QString Opt3);
        listaCliente * myDialog;
    
    };
    
    #endif // COMMESSA_H
    
    

    commessa.cpp

    #include "commessa.h"
    #include "ui_commessa.h"
    #include "listacliente.h"
    
    #include <QSqlTableModel>
    #include <QMessageBox>
    #include <qDebug>
    #include <QTimer>
    #include <QSqlQuery>
    #include <QSqlError>
    #include <QTimer>
    
    
    commessa::commessa(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::commessa)
    {
        ui->setupUi(this);
    }
    
    commessa::~commessa()
    {
        delete ui;
    }
    
    void commessa::stampaStringhe(QString text1, QString text2, QString text3)
    {
        qDebug() << "STR: " << text1 + text2 + text3;
    }
    
    void commessa::on_findCliente_clicked()
    {
    
        myDialog = new listaCliente();
        myDialog->setModal(true);
        QTimer::singleShot(0, myDialog, SLOT(clienteList()));
    
        if(myDialog->exec())
        {
            qDebug() << "Here: ";
            QString Opt1, Opt2, Opt3;
            myDialog->getOptions(Opt1, Opt2, Opt3);
            stampaStringhe (Opt1, Opt2, Opt3);
        }
    }
    

    listaCliente.h

    #ifndef LISTACLIENTE_H
    #define LISTACLIENTE_H
    
    #include <QDialog>
    
    namespace Ui {
    class listaCliente;
    }
    
    class listaCliente : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit listaCliente(QWidget *parent = 0);
        void getOptions (QString text1, QString text2, QString text3);
        ~listaCliente();
    
    private slots:
    
        void clienteList();
    
    private:
        Ui::listaCliente *ui;
    };
    
    #endif // LISTACLIENTE_H
    
    

    listacliente.cpp

    #include "listacliente.h"
    #include "ui_listacliente.h"
    #include "cliente.h"
    
    #include <QSqlTableModel>
    #include <QMessageBox>
    #include <qDebug>
    #include <QSqlQuery>
    #include <QSqlError>
    #include <QTimer>
    
    listaCliente::listaCliente(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::listaCliente)
    {
        ui->setupUi(this);
    }
    
    listaCliente::~listaCliente()
    {
        delete ui;
    }
    
    void listaCliente::clienteList()
    {
        QSqlDatabase db = QSqlDatabase::database("Contact");
        if (db.isOpen())
        {
    
            QSqlTableModel *model = new QSqlTableModel(this,db);
    
            model->setTable("Cliente");
            model->setEditStrategy(QSqlTableModel::OnFieldChange);
    
            model->setHeaderData(0, Qt::Horizontal, tr("Id"));
            model->setHeaderData(1, Qt::Horizontal, tr("Cognome"));
            model->setHeaderData(2, Qt::Horizontal, tr("Nome"));
    		model->setHeaderData(3, Qt::Horizontal, tr("Ragione"));
            
            model->select();
    
            ui->tableView_listaCli->setModel(model);
           
        }else{
            qDebug() << "Problema comunicazione con database";
        }
    }
    void listaCliente::getOptions(QString text1, QString text2, QString text3)
    {
         QMessageBox::information(this, "Inserimento Azienda", "Dati Salvati Correttamente");
         qDebug() << "SO QUI";
         text1 = ui->listCliente_nome_edit->text();
         text2 = ui->listCliente_cognome_edit->text();
         text3 = ui->listCliente_ragSoc_edit->text();;
    }
    
    
    

    Ho messo solo parti di codice mail succo è questo:
    in commessa chiamo la exec sul dialog listaclienti , cerco di prendere dei dati da listaclienti , voglio elaborarli in commessa. Però qualcosa mi sfugge... Sapreste aiutamri?

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

      La soluzione semplice:

      cambia void getOptions (QString text1, QString text2, QString text3); in void getOptions (QString& text1, QString& text2, QString& text3);

      il modo corretto:
      crea 3 metodi publici in listaCliente:

      public:
      QString nome() const{return ui->listCliente_nome_edit->text();}
      QString cognome() const{return ui->listCliente_cognome_edit->text();}
      QString ragSoc() const{return ui->listCliente_ragSoc_edit->text();}
      

      e chiama quilli per leggere i parametri a 1 a 1

      "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

      B 2 Replies Last reply
      0
      • VRoninV VRonin

        La soluzione semplice:

        cambia void getOptions (QString text1, QString text2, QString text3); in void getOptions (QString& text1, QString& text2, QString& text3);

        il modo corretto:
        crea 3 metodi publici in listaCliente:

        public:
        QString nome() const{return ui->listCliente_nome_edit->text();}
        QString cognome() const{return ui->listCliente_cognome_edit->text();}
        QString ragSoc() const{return ui->listCliente_ragSoc_edit->text();}
        

        e chiama quilli per leggere i parametri a 1 a 1

        B Offline
        B Offline
        Bruschetta
        wrote on last edited by
        #3

        @VRonin
        Gentilissimo come sempre!
        Grazie per la risposta

        1 Reply Last reply
        0
        • VRoninV VRonin

          La soluzione semplice:

          cambia void getOptions (QString text1, QString text2, QString text3); in void getOptions (QString& text1, QString& text2, QString& text3);

          il modo corretto:
          crea 3 metodi publici in listaCliente:

          public:
          QString nome() const{return ui->listCliente_nome_edit->text();}
          QString cognome() const{return ui->listCliente_cognome_edit->text();}
          QString ragSoc() const{return ui->listCliente_ragSoc_edit->text();}
          

          e chiama quilli per leggere i parametri a 1 a 1

          B Offline
          B Offline
          Bruschetta
          wrote on last edited by Bruschetta
          #4

          @VRonin
          I parametri finalmente risco a "prenderli" infatti la funzione viene chiamata correttamente e mi butta su output i dati giusti.
          Quando però cerco di popolare i campi di textedit con i valori trovati non succede nulla. Praticamente nella "stampastringhe" i comandi:

            ui->commessa_nome_cliente_edit->setText(text1);
            ui->commessa_cognome_cliente_edit->setText(text2);  
            ui->commessa_ragSoc_cliente_edit->setText(text3);
          

          Non fanno quello che dovrebbero, ovvero non mi popolano i campi.
          Ho anche provato a reimplementare tutto con dei signal/slots passando un solo parametro.

              connect( this, SIGNAL( sendCliente( const QString &) ), &comm, SLOT( getCliente( const QString & ) ) );
          

          Funziona tutto, anche qui vengono chiamate le funzioni giuste e ritornano i valori giusti ma poi la solita

            ui->commessa_nome_cliente_edit->setText(text1);
          

          Non mi viene popolato il LineEdit ... Hai idea di dove potrei sbagliare? Grazie in anticipo..
          Praticamente l'evento intercettato nel dialog figlio non modifica la ui del dialog padre. Quando chiudo il figlio non è cambiato nulla..

          B 1 Reply Last reply
          0
          • B Bruschetta

            @VRonin
            I parametri finalmente risco a "prenderli" infatti la funzione viene chiamata correttamente e mi butta su output i dati giusti.
            Quando però cerco di popolare i campi di textedit con i valori trovati non succede nulla. Praticamente nella "stampastringhe" i comandi:

              ui->commessa_nome_cliente_edit->setText(text1);
              ui->commessa_cognome_cliente_edit->setText(text2);  
              ui->commessa_ragSoc_cliente_edit->setText(text3);
            

            Non fanno quello che dovrebbero, ovvero non mi popolano i campi.
            Ho anche provato a reimplementare tutto con dei signal/slots passando un solo parametro.

                connect( this, SIGNAL( sendCliente( const QString &) ), &comm, SLOT( getCliente( const QString & ) ) );
            

            Funziona tutto, anche qui vengono chiamate le funzioni giuste e ritornano i valori giusti ma poi la solita

              ui->commessa_nome_cliente_edit->setText(text1);
            

            Non mi viene popolato il LineEdit ... Hai idea di dove potrei sbagliare? Grazie in anticipo..
            Praticamente l'evento intercettato nel dialog figlio non modifica la ui del dialog padre. Quando chiudo il figlio non è cambiato nulla..

            B Offline
            B Offline
            Bruschetta
            wrote on last edited by
            #5

            @Bruschetta
            mi rispondo da solo e creoc che il problema sia causato dal fatto che la connect la faccio su di un nuovo oggetto "commessa" che nasce e muore all'interno della chiamata di funzione.
            Però adesso non so come passare alla chiamata di connect

               connect( this, SIGNAL( sendCliente( const QString &) ), &commessa, SLOT( getCliente( const QString & ) ) );
            

            il puntatore a commessa che è anche il dialog padre che andrebbe aggiornato..

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

              Il dialogo figlio non deve conoscere il dialogo padre.
              emetti i segnali dal figlio e la connessione e' fatta dal padre quando crea il figlio

              "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
              • B Offline
                B Offline
                Bruschetta
                wrote on last edited by
                #7

                Grazie, non avevo capito come funzionava la connect. Ora fa quel che deve fare. :D

                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