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

Pass variable value from Dialog to MainWindow


  • Lifetime Qt Champion

    Do you mean the MainWindow still shows the old value ? If so, are you updating the related widget once you executed your dialog ?



  • @SGaist there's no widget BaudRate is only a variable (not showed in mainwindow)


  • Lifetime Qt Champion

    So if you have something like:

    qDebug() << "Before" << BaudRate;
    ImpostazioniSP SetImp (this, BaudRate, DataBits, Parity);
    SetImp.setModal(true);
    if ( SetImp.exec() == QDialog::Accepted ) {
        BaudRate = SetImp.getBaudRate();
        qDebug() << "After" << BaudRate;
    }
    

    What's the result ?



  • @SGaist this is the result:

    Before "115200"
    After "115200"

    in the dialog qdebug print 9600 (as i've setted)
    but in the mainwindows result still 115200


  • Lifetime Qt Champion

    Can you show the complete code of the current version of your dialog ?



  • @SGaist

    #include "impostazionisp.h"
    #include "ui_impostazionisp.h"
    #include <QSerialPort>
    #include <QSerialPortInfo>
    #include <QMessageBox>
    #include <QtDebug>
    
    static const char blankString[] = QT_TRANSLATE_NOOP("SettingsDialog", "N/A");
    
    //QSerialPort Serial;
    
    ImpostazioniSP::ImpostazioniSP(QWidget *parent, const QString BaudRate, const QString DataBits, const QString Parity) :
        QDialog(parent),
        BaudRate(BaudRate),
        DataBits(DataBits),
        Parity(Parity),
        ui(new Ui::ImpostazioniSP)
    
    {
        ui->setupUi(this);
    
        QMessageBox msg;
        ui->comboBox_Porta->clear();
        QString description;
        QString manufacturer;
        QString serialNumber;
        const auto infos = QSerialPortInfo::availablePorts();
        for (const QSerialPortInfo &info : infos) {
            QStringList list;
            description = info.description();
            manufacturer = info.manufacturer();
            serialNumber = info.serialNumber();
            list << info.portName()
                 << (!description.isEmpty() ? description : blankString)
                 << (!manufacturer.isEmpty() ? manufacturer : blankString)
                 << (!serialNumber.isEmpty() ? serialNumber : blankString)
                 << info.systemLocation()
                 << (info.vendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : blankString)
                 << (info.productIdentifier() ? QString::number(info.productIdentifier(), 16) : blankString);
    
            ui->comboBox_Porta->addItem(list.first(), list);
        }
        
        //Baud Rate
        ui->comboBox_BaudRate->addItem("9600");
        ui->comboBox_BaudRate->addItem("19200");
        ui->comboBox_BaudRate->addItem("38400");
        ui->comboBox_BaudRate->addItem("115200");
        ui->comboBox_BaudRate->setCurrentIndex(0);
        //Data Bits
        ui->comboBox_DataBits->addItem("5");
        ui->comboBox_DataBits->addItem("6");
        ui->comboBox_DataBits->addItem("7");
        ui->comboBox_DataBits->addItem("8");
         ui->comboBox_DataBits->setCurrentIndex(3);
        //Parity
        ui->comboBox_Parity->addItem("None");
        ui->comboBox_Parity->addItem("Even");
        ui->comboBox_Parity->addItem("Odd");
        ui->comboBox_Parity->addItem("Mark");
        ui->comboBox_Parity->addItem("Space");
        ui->comboBox_Parity->setCurrentIndex(0);
        //Stop Bits
        ui->comboBox_StopBits->addItem("1");
        ui->comboBox_StopBits->addItem("1.5");
        ui->comboBox_StopBits->addItem("2");
        ui->comboBox_StopBits->setCurrentIndex(0);
        //Flow Control
        ui->comboBox_FlowControl->addItem("None");
        ui->comboBox_FlowControl->addItem("RTS/CTS");
        ui->comboBox_FlowControl->addItem("XON/XOFF");
        ui->comboBox_FlowControl->setCurrentIndex(0);
    }
    
    ImpostazioniSP::~ImpostazioniSP()
    {
        delete ui;
    }
    
    void ImpostazioniSP::on_pushButton_Annulla_clicked()
    {
        close();
    }
    
    void ImpostazioniSP::on_pushButton_OK_clicked()
    {
        QMessageBox msg;
        //Imposta Valori Variabili
        // Baud Rate
        int Baud = ui->comboBox_BaudRate->currentText().toInt();
        switch (Baud) {
            case (9600):
                        BaudRate = "9600";
                        break;
            case (19200):
                        BaudRate ="19200";
                        break;
            case (38400):
                        BaudRate = "38400";
                        break;
            case (115200):
                        BaudRate = "115200";
                        break;
            default:
                        BaudRate = "9600";
        }
        getBaudRate();
        // Data Bits
        int Bits = ui->comboBox_DataBits->currentText().toInt();
        switch (Bits) {
            case (5) :
                    DataBits = "Data5";
                    break;
            case (6) :
                    DataBits="Data6";
                    break;
            case (7) :
                    DataBits="Data7";
                    break;
            case (8) :
                     DataBits="Data8";
                    break;
            default:
                    DataBits="Data8";
        }
        // Parity
        if (ui->comboBox_Parity->currentText() == "None") Parity="NoParity";
        if (ui->comboBox_Parity->currentText() == "Even") Parity="EvenParity";
        if (ui->comboBox_Parity->currentText() == "Odd") Parity="OddParity";
        if (ui->comboBox_Parity->currentText() == "Mark") Parity="MarkParity";
        if (ui->comboBox_Parity->currentText() == "Space") Parity="SpaceParity";
        msg.setText("OK: Settaggio Impostazioni Eseguito Correttamente");
        msg.exec();
        close();
    }
    
    QString ImpostazioniSP::getBaudRate() {
        qDebug() << "BaudRate:" << BaudRate;
        return BaudRate;
    }
    /*
    QString ImpostazioniSP::getDataBits() {
    return DataBits;
    }
    
    QString ImpostazioniSP::getParity() {
    return Parity;
    }
    */
    
    

  • Lifetime Qt Champion

    Hi
    Its a bit odd as you seem to set BaudRate in
    void ImpostazioniSP::on_pushButton_OK_clicked()
    so in
    QString ImpostazioniSP::getBaudRate() {
    qDebug() << "BaudRate:" << BaudRate;
    return BaudRate;
    }

    does it show the value you set with comboBox_BaudRate ?


  • Lifetime Qt Champion

    Why are you using that switch ? You already have the baud rate as a string in the combo box.

    As already suggest, returning the combo box selected text is shorter and less error prone.



  • @mrjj Yes:
    in dialog qdebug print BaudRate 9600
    in mainwindow qdebug print 115200 both Before and After



  • @SGaist OK, i've fixed it as you suggested


  • Lifetime Qt Champion

    @TheCipo76
    Hmm that seems almost impossible :)
    I must be missing something.
    So function seems to return expected result.
    Just to 100% sure, please try

    qDebug() << "Before" << BaudRate;
    ImpostazioniSP SetImp (this, BaudRate, DataBits, Parity);
    SetImp.setModal(true);
    if ( SetImp.exec() == QDialog::Accepted ) {
        qDebug() << "from func" << SetImp.getBaudRate();
    }
    

    and tell what "from func" says ?



  • @mrjj

    Before "115200" (mainwindow)
    BaudRate: "9600" (dialog)

    "from func" was not showed

    i've modify you code:

    qDebug() << "Before" << BaudRate;
        ImpostazioniSP SetImp (this, BaudRate, DataBits, Parity);
        SetImp.setModal(true);
        if ( SetImp.exec() == QDialog::Accepted ) {
            BaudRate=SetImp.getBaudRate();
        }
        qDebug() << "from func" << SetImp.getBaudRate();
    

    and this is result:

    Before "115200"
    BaudRate: "9600"
    BaudRate: "9600"
    from func "9600"


  • Lifetime Qt Champion

    What is stranger is that @mrjj's code is mostly the same as mine :-D

    Which means that you didn't accept the dialog properly. Are you clicking on some OK button the closes it ? Or are you just clicking the X button ?



  • @SGaist i close the dialog as ultimate instruction of OK pushbutton


  • Lifetime Qt Champion

    You're calling close, not accept.



  • @SGaist i have called accept before close

    this is qdebug message:

    Before "115200"
    BaudRate: "9600"
    BaudRate: "9600"
    BaudRate: "9600"
    from func "9600"

    why show BaudRate: "9600" 3 times???



  • @SGaist OK, finally works!!! Thanks to all


  • Lifetime Qt Champion

    There's no need to call close, accept will close the dialog for you.

    Likely because you are calling getBaudRate in several places.


  • Lifetime Qt Champion

    Ah, i was fooled by
    qDebug() << "After" << BaudRate;
    as its inside the if for Accepted so i assumed that was in order :)
    Good found!



  • Thanks to all!!


Log in to reply