Changing the property's of widgets from another window [SOLVED]



  • Hi,

    I am new to c++ and Qt so maybe this is a stupid question but I can't figure it out. I made a widget application with two windows. I got a main window and a configuration window. Now I want to change the text of a button in my mainwindow when I press a button in my configuration window but I don't know how to. If anyone could provide some kind of help or tip it would be appreciated.


  • Moderators

    Hi, welcome to devnet.

    Emit a signal from your dialog and connect it to a slot in your main window that will change the text.

    Signlas/slots are one of the core concepts of Qt so it's important to grasp how they work and how to use them.
    You can read a lot more about them and look at some examples here.



  • @Chris-Kawa

    Hi thanks for the reply,

    I tryed it but it didn't work. I got 2 classes: MainWindow & Configuration. This is my code:

    Confgiuration.h

    signals:
      void sendSignal();
    

    Configuration.cpp

    void Configuration::on_pushButton_clicked()
    {
      emit sendSignal();
    }
    

    MainWindow.h

    private slots:
      void setVariable();
    

    MainWindow.cpp

    void MainWindow::setVariable()
    {
      ui->FrontSlot1->setText("frontslot1");
      ui->FrontSlot1->setDisabled(false);
    }
    
    void MainWindow::setUpPage()
    {
    connect(Configuration, SIGNAL(sendSignal()), this, SLOT(setVariable()));
    }
    

    And here is where I get the following error but I can't figure out why.

    error: expected primary-expression before ',' token
     connect(Configuration, SIGNAL(sendSignal()), this, SLOT(setVariable()));

  • Moderators

    The first argument to connect() is a pointer to an instance that emits a signal, not a class name.
    Pass there a pointer to the Configuration class instance that is your dialog.



  • @Chris-Kawa

    Thanks for replying,

    I changed the code in my MainWindow.cpp to:

    void MainWindow::setUpPage()
    {
      Configuration *configpointer = new Configuration;
      connect(configpointer, SIGNAL(setSlots()), this, SLOT(setSlots()));
    }
    

    It compiles without any problem now but I don't see anything changing in the mainwindow.


  • Moderators

    configpointer is a local variable (that leaks memory by the way).
    You should connect it to the actual instance of the dialog you use, not some temporary that never gets shown.
    Also setSlots is neither a signal in Configuration class nor a slot in MainWindow.

    Here's an example with both Configuration and MainWindow shown at sturtup:

    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
        
        MainWindow w;
        Configuration cfg;
        connect(&cfg, &Configuration::sendSignal, &w, &MainWindow::setVariable);
        w.show();
        cfg.show();
    
        return a.exec();
    }
    

    If, on the other hand, you show your Configuration dialog in response to some button clicked in MainWindow here's how the code may look like:

    void MainWindow::showConfigurationButtonClicked() {
        Configuration cfg;
        connect(&cfg, &Configuation::sendSignal, this, &MainWindow::setVariable);
        cfg.exec();
    }
    


  • @Chris-Kawa

    Sorry for being unclear but I don't think you understood my problem.

    I got this code in my MainWindow.cpp now:

    void MainWindow::on_Configuration_clicked()
    {
      Configuration Configurationob;
      Configurationob.setModal(true);
      Configurationob.exec();
    
    }
    
    void MainWindow::setSlots(){
      ui->FrontSlot1->setText("updated");
      ui->FrontSlot1->setDisabled(false);
      ui->FrontSlot1->update();
    }
    
    void MainWindow::setUpPage()
    {
      Configuration cfg;
      connect(&cfg, SIGNAL(sendSignal()), this, SLOT(setSlots()));
    }
    

    I got a button in my mainwindow called "FrontSlot1" which is disabled by default. What I want is that when the user presses a button in the configuration window it will call the setSlots() function and execute the commands in it. I dont want to open a new window. I already did that with the void MainWindow::on_Configuration_clicked() function.


  • Moderators

    I understood your problem. You didn't understood the answer, as it addresses exactly that ;)

    Let me be more clear. Look at your code. In on_Configuration_clicked you create an instance of Configuration called Configurationob and show it. In setUpPage method you create another, totally unrelated instance of that class called cfg and connect to it. That's not gonna do what you want. Configurationob and cfg are totally separate, unrelated pieces of data.

    The solution here is (similar to what I showed in the example) this:

    void MainWindow::on_Configuration_clicked() {
      Configuration Configurationob;
      Configurationob.setModal(true);
      connect(&Configurationob, SIGNAL(sendSignal()), this, SLOT(setSlots())); //the important part
      Configurationob.exec();
    }
    
    void MainWindow::setSlots(){
      ui->FrontSlot1->setText("updated");
      ui->FrontSlot1->setDisabled(false);
      ui->FrontSlot1->update();
    }
    


  • @Chris-Kawa

    Thank you very much!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.