Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Ritorno dati da QDialog



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



  • 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



  • @VRonin
    Gentilissimo come sempre!
    Grazie per la risposta



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



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



  • 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



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


Log in to reply