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

Passing QRadioButton value from one window to another window in Qt (no matching function for call to)



  • I want to pass selected QRadioButton's value from one Window to another. I am confused with the function declaration to accept the text value in Second Window, here is my code.

    Window1.cpp

    @void SelectOS :: processNextButton(){
    if(ui->win32->isChecked()){
    QString loc = "WIN/32Bit";
    SelectSoftware *ss = new SelectSoftware (loc);
    this->hide();
    ss->show();
    }
    else
    {
    //QMessageBox:warning();
    }
    }@

    Window2.h

    @public:
    SelectSoftware(const QString &text, QWidget *parent=0);@

    Window2.cpp

    @SelectSoftware::SelectSoftware(const QString &text, QWidget *parent):QMainWindow(parent),ui(new ui::SelectSoftware)
    {
    QString softpath = text;
    qDebug << softpath;
    }@

    But when I call

    @ss = new SelectSoftware();@

    OR

    @ss= new SelectSoftware(const QString &text, QWidget *parent);@

    in Window2.cpp, I get the error : no matching function for call to SelectSoftware::SelectSoftware()

    Where am I wrong?



  • For you second window do you have a default constructor SelectSoftware() declared in your header file ? Or else specify a default text value for your QString.

    @class SelectSoftware : public QWidget
    {
    Q_OBJECT
    public:
    explicit SelectSoftware(QWidget *parent = 0);
    };@



  • Thanks sam, I need this loc variable to be available in each every function definition in Window2.cpp, how can I do this??



  • For your constructor you can set the default values as

    @SelectSoftware(const QString &text = "", QWidget *parent=0);@

    which will set the default value of text to empty string, if you pass the string values while creating an instance of SelectorSodtware then it will take that value.



  • Well, now I'll tell my problem: in Window2.cpp, there is one SLOT called
    test(),
    in that test, its being defined as
    ss = new SelectSoftware ,
    as we've provided arguments
    QString &text,
    I've modified to
    ss = new SelectSoftware(text).
    But this is creating the problem, again its executing
    SelectSoftware(text)
    function, where the value of text has become empty and the application is crashing!!!



  • Can you post a test code that relects the same behaviour. It will be helpful for us to understand your requirements.



  • Window2.cpp

    @void SelectSoftware::showMainPage()
    {
    ss = new SelectSoftware(softpath); // here its creating problem, not going forward and app is crashing!!!

    for(int j = 0; j < softwareList.size(); j++){
        if(checkBox[j]->isChecked()){
            if(!comboBox[j]->currentIndex()){
                QMessageBox::warning(this, "Select version !", "Select version number for all selected software");
                return;
            }
        }
    }
    
    for(int i = 0; i < softwareList.size(); i++){
        if(checkBox[i]->isChecked()){
            ss->selectedSoftList.push_back(checkBox[i]->text());
            ss->selectedVerList.push_back(comboBox[i]->currentText());
        }
    }
    
    if(!ss->selectedSoftList.size()){
        QMessageBox::warning(this, "No product Selected !", "Select one");
        return;
    }
    

    else{
    SelectionPage* sp = new SelectionPage;
    this->hide();
    sp->show();
    }
    }

    void SelectSoftware::test(const int id)
    {
    if(checkBox[id]->isChecked()){
    comboBox[id]->setEnabled(true);
    comboBox[id]->addItem(" Select anyone ");
    QString path = qApp->applicationDirPath() + "/products/" + checkBox[id]->text();

        QDir dir;
        dir.cd(path);
        dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
    
        QFileInfoList list = dir.entryInfoList();
        for (int i = 0; i < list.size(); ++i) {
            QFileInfo fileInfo = list.at(i);
            comboBox[id]->addItem(fileInfo.fileName());
        }
    
    }else{
        comboBox[id]->clear();
        comboBox[id]->setDisabled(true);
    }
    

    }

    void SelectSoftware::getSoftwareDetails()
    {
    QString fileName = qApp->applicationDirPath() + "/abc/" + SOFTWARELIST;
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
    QString msg = "Could not find the file " + fileName;
    errorExit(msg);
    }

    QTextStream in(&file);
    while (!in.atEnd()) {
        QString line = in.readLine();
        processLine(line.toLower());
    }
    

    }

    void SelectSoftware::processLine(QString str)
    {
    QStringList list = str.split(",");
    QDir path = qApp->applicationDirPath() + "/products/" + list[0];
    if(path.exists() && (list.size() == 2)){
    QString tmp = list[0];
    tmp = tmp.toLower();
    softwareList.push_back(tmp);
    }
    }

    void SelectOption::initializeUi()
    {
    this->setWindowTitle("Window2");

    QGridLayout *gridLayout1 = new QGridLayout();
    gridLayout1->setMargin(5);
    gridLayout1->setSpacing(5);
    
    QSignalMapper* signalMapper = new QSignalMapper();
    
    for(int i = 0; i < list.size(); i++){
        radioButton[i] = new QRadioButton();
        radioButton[i]->setText(softwareList[i]);
        signalMapper->setMapping(radioButton[i], i);
        gridLayout1->addWidget(radioButton[i], i/1, i%1);
        connect(radioButton[i], SIGNAL(clicked()),signalMapper, SLOT(map()));
    }
    

    connect(signalMapper, SIGNAL(mapped(const int &)),this, SIGNAL(radioChecked(const int &)));
    connect(this, SIGNAL(radioChecked(const int &)),this, SLOT(test(const int)));

    QGridLayout *gridLayout2 = new QGridLayout();
    gridLayout2->setMargin(5);
    gridLayout2->setSpacing(5);
    
    for(int j = 0; j < list.size(); j++){
        comboBox[j] = new QComboBox();
        comboBox[j]->setDisabled(true);
        gridLayout2->addWidget(comboBox[j], j/1, j%1);
    }
    
    QPushButton *nextButton = new QPushButton("Next >");
    nextButton->setDefault(true);
    connect(nextButton, SIGNAL(clicked()), this, SLOT(showMainPage()));
    
    QPushButton *backButton = new QPushButton("< Back");
    backButton->setDefault(true);
    connect(backButton, SIGNAL(clicked()), this,     SLOT(showSelectOS()));
    
    QPushButton *cancelButton = new QPushButton("Cancel");
    cancelButton->setDefault(true);
    connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancel()));
    
    QHBoxLayout *hboxlayout;
    hboxlayout = new QHBoxLayout();
    hboxlayout->addLayout(gridLayout1);
    hboxlayout->addLayout(gridLayout2);
    
    QHBoxLayout *layout;
    layout = new QHBoxLayout();
    layout->addStretch(10);
    layout->addWidget(nextButton);
    layout->addWidget(backButton);
    layout->addWidget(cancelButton);
    layout->addStretch(10);
    
    QVBoxLayout *mainLayout;
    mainLayout = new QVBoxLayout();
    mainLayout->addLayout(hboxlayout);
    mainLayout->addLayout(layout);
    ui->centralwidget->setLayout(mainLayout);
    

    }

    QVector<QString> SelectSoftware::getSelectedSoftware()
    {
    return ss->selectedSoftList;
    }

    QVector<QString> SelectSoftware::getSelectedVersion()
    {
    return ss->selectedVerList;
    }

    QStringList SelectSoftware::getSelectedModules()
    {
    return selectedModuleList;
    }
    @



  • What happens inside the constructor of SelectSoftware class ? where is initializeUi called ?



  • Here is the code of SelectSoftware Constructor...

    @#include "selectsoftware.h"
    #include "ui_selectsoftware.h"

    SelectSoftware *ss;
    QStringList selectedModuleList;

    SelectSoftware::SelectSoftware(const QString &text, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SelectSoftware)
    {
    ui->setupUi(this);
    softpath = text;
    setWindowPosition();
    getSoftwareDetails();
    initializeUi();
    }

    SelectSoftware::~SelectSoftware()
    {
    delete ui;
    }

    void SelectSoftware::setWindowPosition()
    {
    QDesktopWidget *desktop = QApplication::desktop();
    int x = (desktop->width() - size().width())/2;
    int y = (desktop->height() - size().height())/2;
    move(x, y-50);
    setFixedSize(size().width(), size().height());
    }

    void SelectSoftware::cancel()
    {
    qApp->exit(0);
    }@



  • Can we pass multiple text parameter values to @SelectSoftware::SelectSoftware(const QString &text, QWidget *parent)@
    or we need to do like @SelectSoftware::SelectSoftware(const QString &text,const QString &path, QWidget *parent)@ to pass another variable ??



  • Yes you need to provide the argument type / number of arguments in the function declaration.

    I still have doubts with your implemetation, a new instance of the same class is created each time showMainPage() is called, why is it required shouldnt it be handled from outside.


Log in to reply