Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. how to modify mainform.ui components from other form, and vice versa
Forum Updated to NodeBB v4.3 + New Features

how to modify mainform.ui components from other form, and vice versa

Scheduled Pinned Locked Moved Solved General and Desktop
15 Posts 3 Posters 1.5k Views 1 Watching
  • 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.
  • C Offline
    C Offline
    Cuban Akira
    wrote on 26 Oct 2018, 12:42 last edited by
    #1

    hi!, how can i modify mainform.ui components(Qlabels, comboBox, etc ) from other form, and vice versa.
    ex: 1-mainform.ui has a button(so called "button1"), when i click button1 i want to disable a button located in otherform.ui (so called "button2")
    2- when i click on otherform.ui's button2, i want to clear a comboBox , located in mainform.ui

    In ex #1 : i dont know how to reference otherform.ui, using the way> otherform obj;
    obj.ui.button2.disabled(); the compiler show me a error!.

    in ex#2: in the otherform.cpp i referencie the mainform.ui, creating an object type mainform,(mainform obj;), and then obj.ui.comboBox.clear();, when i run the app, an error said > mainform *ui is private, so i go to the mainform.h and make it public, then no signals of errors happen, but nothing happens.

    someone can help me? excuse my english.

    1 Reply Last reply
    0
    • D Offline
      D Offline
      dheerendra
      Qt Champions 2022
      wrote on 26 Oct 2018, 13:05 last edited by
      #2

      You need to work with signals/slots between the object. You need to define the signals in mainform1 and slots in mainform2. Cannect the signal from mainform1 to mainform2 object. You must be having two different classes to represent two forms.

      1. mainform1.ui - MainForm1.class(define signal button1Clicked())
      2. mainform2.ui -MainForm2.class(define slot disableButton())

      connect(mainform1,SIGNAL(button1Clicked()),mainForm2,SLOT(disableButton()));

      Inside the slot disableButton() - call ui.button1.setEnable(true)

      You need to work with objects here.

      Dheerendra
      @Community Service
      Certified Qt Specialist
      http://www.pthinks.com

      C 1 Reply Last reply 26 Oct 2018, 16:39
      1
      • D dheerendra
        26 Oct 2018, 13:05

        You need to work with signals/slots between the object. You need to define the signals in mainform1 and slots in mainform2. Cannect the signal from mainform1 to mainform2 object. You must be having two different classes to represent two forms.

        1. mainform1.ui - MainForm1.class(define signal button1Clicked())
        2. mainform2.ui -MainForm2.class(define slot disableButton())

        connect(mainform1,SIGNAL(button1Clicked()),mainForm2,SLOT(disableButton()));

        Inside the slot disableButton() - call ui.button1.setEnable(true)

        You need to work with objects here.

        C Offline
        C Offline
        Cuban Akira
        wrote on 26 Oct 2018, 16:39 last edited by
        #3

        @dheerendra

        i pass like a hour reading online about signals and slot in QT, is amazing,
        with this code y can manipulate behaviors on the same form
        ex. connect(ui->pushButton,SIGNAL(clicked(bool)),ui->comboBox, SLOT (hide()));
        but, working with objects placed in diferent forms i dont know how to reference it
        ex. this dont work>
        connect(ui->pushButton,SIGNAL(clicked(bool)),Form2.ui->comboBox, SLOT (hide()));
        cant reference objects from other forms

        M 1 Reply Last reply 26 Oct 2018, 17:46
        0
        • C Cuban Akira
          26 Oct 2018, 16:39

          @dheerendra

          i pass like a hour reading online about signals and slot in QT, is amazing,
          with this code y can manipulate behaviors on the same form
          ex. connect(ui->pushButton,SIGNAL(clicked(bool)),ui->comboBox, SLOT (hide()));
          but, working with objects placed in diferent forms i dont know how to reference it
          ex. this dont work>
          connect(ui->pushButton,SIGNAL(clicked(bool)),Form2.ui->comboBox, SLOT (hide()));
          cant reference objects from other forms

          M Offline
          M Offline
          mrjj
          Lifetime Qt Champion
          wrote on 26 Oct 2018, 17:46 last edited by mrjj
          #4

          @Cuban-Akira
          Hi
          Instead of surfacing all the widgets from form2, you would add access slot function to be triggered from out
          side. the slot it self , will then ask the UI elements directly.

          So for Form2, you would add
          public slots:
          void HideSomething() {
          ui->button->hide();
          }

          and from form1, you connect to buttons clicked() to HideSomething()

          that way, form1 do not have know every widget that form2 has -
          but can use an interface to carry out
          any needed call to the actual widgets in form2.
          This a better design versus making UI public.

          this example seems a bit silly to hide a button and not its something you would need very often.
          However, imagine you had a form2, with a lineEdit.
          From form1, yo want a persons name to be put in that lineEdit.
          Then you add a new slot called
          void setName(QString name) {
          ui->lineEdit->setText(name);
          }

          and use that from form1 to make it display name.
          Say you later found out, you want to show name in a QLabel.
          All you need is to change setName slot to use this label, but
          rest of the code will work unmodified as form1, only knows
          setName, not that it was an lineEdit in form2.

          So this make application far more robust as small changes wont
          change how rest of the program uses form2.
          Rest of program , only knows the interface for displaying data you defined.
          Not how its was build internally.
          I hope this makes sense :)

          C 1 Reply Last reply 26 Oct 2018, 18:55
          1
          • M mrjj
            26 Oct 2018, 17:46

            @Cuban-Akira
            Hi
            Instead of surfacing all the widgets from form2, you would add access slot function to be triggered from out
            side. the slot it self , will then ask the UI elements directly.

            So for Form2, you would add
            public slots:
            void HideSomething() {
            ui->button->hide();
            }

            and from form1, you connect to buttons clicked() to HideSomething()

            that way, form1 do not have know every widget that form2 has -
            but can use an interface to carry out
            any needed call to the actual widgets in form2.
            This a better design versus making UI public.

            this example seems a bit silly to hide a button and not its something you would need very often.
            However, imagine you had a form2, with a lineEdit.
            From form1, yo want a persons name to be put in that lineEdit.
            Then you add a new slot called
            void setName(QString name) {
            ui->lineEdit->setText(name);
            }

            and use that from form1 to make it display name.
            Say you later found out, you want to show name in a QLabel.
            All you need is to change setName slot to use this label, but
            rest of the code will work unmodified as form1, only knows
            setName, not that it was an lineEdit in form2.

            So this make application far more robust as small changes wont
            change how rest of the program uses form2.
            Rest of program , only knows the interface for displaying data you defined.
            Not how its was build internally.
            I hope this makes sense :)

            C Offline
            C Offline
            Cuban Akira
            wrote on 26 Oct 2018, 18:55 last edited by
            #5

            @mrjj
            i understand your point, but still have errors on my code
            after create the signals and slot, i dont know how to write the 3rd argument in connect funtion

            connect(ui->pushButton, SIGNAL (click()) , information , SLOT(hideEditar()));

            the 3rd parameter (the name of the 2nd form, "information") is wrong,
            if i create> information *info= new information();, and putt "info" as the 3rd argument of connect the program launch an exeption, and stop

            M 1 Reply Last reply 26 Oct 2018, 19:09
            0
            • C Cuban Akira
              26 Oct 2018, 18:55

              @mrjj
              i understand your point, but still have errors on my code
              after create the signals and slot, i dont know how to write the 3rd argument in connect funtion

              connect(ui->pushButton, SIGNAL (click()) , information , SLOT(hideEditar()));

              the 3rd parameter (the name of the 2nd form, "information") is wrong,
              if i create> information *info= new information();, and putt "info" as the 3rd argument of connect the program launch an exeption, and stop

              M Offline
              M Offline
              mrjj
              Lifetime Qt Champion
              wrote on 26 Oct 2018, 19:09 last edited by mrjj
              #6

              @Cuban-Akira
              hi
              "information" needs to be a pointer to a class instance. not classname.
              So if forms Type/Class is Information
              then
              information *info= new information(this); // make instance of information form
              connect(ui->pushButton, SIGNAL (click()) , info, SLOT(hideEditar()));

              C 1 Reply Last reply 26 Oct 2018, 19:19
              0
              • M mrjj
                26 Oct 2018, 19:09

                @Cuban-Akira
                hi
                "information" needs to be a pointer to a class instance. not classname.
                So if forms Type/Class is Information
                then
                information *info= new information(this); // make instance of information form
                connect(ui->pushButton, SIGNAL (click()) , info, SLOT(hideEditar()));

                C Offline
                C Offline
                Cuban Akira
                wrote on 26 Oct 2018, 19:19 last edited by Cuban Akira
                #7

                @mrjj
                thanks a lot men, but i dont know what happens
                when i put
                informacion *info = new informacion(this);

                connect(ui->pushButton, SIGNAL (click()) , info , SLOT(hideEditar()));

                the app stop, says, > crashed

                M 1 Reply Last reply 26 Oct 2018, 19:27
                0
                • C Cuban Akira
                  26 Oct 2018, 19:19

                  @mrjj
                  thanks a lot men, but i dont know what happens
                  when i put
                  informacion *info = new informacion(this);

                  connect(ui->pushButton, SIGNAL (click()) , info , SLOT(hideEditar()));

                  the app stop, says, > crashed

                  M Offline
                  M Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on 26 Oct 2018, 19:27 last edited by
                  #8

                  @Cuban-Akira
                  Hi
                  Sounds like it crashes.
                  Can you show the actual code ?
                  The connect seems fine so its just something else.

                  can it be in hideEditar it crashes ?

                  Can it be you fun this code BEFORE the setupUI() in form1 ?

                  C 1 Reply Last reply 26 Oct 2018, 19:34
                  1
                  • M mrjj
                    26 Oct 2018, 19:27

                    @Cuban-Akira
                    Hi
                    Sounds like it crashes.
                    Can you show the actual code ?
                    The connect seems fine so its just something else.

                    can it be in hideEditar it crashes ?

                    Can it be you fun this code BEFORE the setupUI() in form1 ?

                    C Offline
                    C Offline
                    Cuban Akira
                    wrote on 26 Oct 2018, 19:34 last edited by
                    #9

                    @mrjj

                    i think the mistake is in " informacion *info = new informacion(this);"
                    cause "this" reference to MainWindow class, not informacion class

                    this is the constructor of MainWindow.cpp

                    MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                    {

                    ui->setupUi(this);
                    

                    QFontDatabase::addApplicationFont(":/fonts/imagenes/usuziv2.ttf");

                     Aeropuerto *obj = new Aeropuerto();
                     Avion *obj2 = new Avion();
                    
                     informacion *info = new informacion(this);
                     connect(ui->pushButton, SIGNAL (click()) , info , SLOT(hideEditar()));
                    
                     obj->crearFlota();
                     obj->flotaAviones.sort(obj2->mayorNombre);
                    
                     list<Avion>::iterator it;
                     int i = 0;
                    for(it=obj->flotaAviones.begin(); it!=obj->flotaAviones.end();  it++)
                    {
                    ui->comboBox->insertItem(i, (*it).getAerolinea());
                    

                    i++;
                    }

                     obj->xt = obj->flotaAviones.begin();
                     obj->yt = obj->xt;
                    

                    ui->textBrowser->hide();
                    ui->mainToolBar->hide();
                    ui->statusBar->hide();
                    }

                    //this is informacion.h

                    #ifndef INFORMACION_H
                    #define INFORMACION_H

                    #include <QDialog>
                    #include <list>

                    namespace Ui {
                    class informacion;
                    }

                    class informacion : public QDialog
                    {
                    Q_OBJECT

                    public:
                    explicit informacion(QWidget *parent = 0);

                    ~informacion();
                    

                    private slots:
                    void on_pushButton_clicked();

                    void on_pushButton_2_clicked();
                    
                    void on_editar_clicked();
                    
                    void on_ok_clicked();
                    

                    public slots:
                    void hideEditar();

                    private:
                    Ui::informacion *ui;

                    };

                    //and this is definition of hideEditar() on information.cpp

                    void informacion::hideEditar()
                    {
                    ui->editar->hide();
                    }

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on 26 Oct 2018, 19:39 last edited by mrjj
                      #10

                      Hi
                      Can you show implementation of
                      informacion(QWidget *parent = 0);
                      I suspect the UI is not newed and it crashes with
                      ui->editar->hide(); as ui might not be setup via the normal
                      setupUI()
                      So check if you have code that initilize
                      Ui::informacion *ui;
                      like
                      ui(new Ui::informacion)

                      Note that
                      informacion *info = new informacion(this);"
                      "this" is used as parent as param name of the constructor suggests.

                      C 1 Reply Last reply 26 Oct 2018, 19:48
                      1
                      • M mrjj
                        26 Oct 2018, 19:39

                        Hi
                        Can you show implementation of
                        informacion(QWidget *parent = 0);
                        I suspect the UI is not newed and it crashes with
                        ui->editar->hide(); as ui might not be setup via the normal
                        setupUI()
                        So check if you have code that initilize
                        Ui::informacion *ui;
                        like
                        ui(new Ui::informacion)

                        Note that
                        informacion *info = new informacion(this);"
                        "this" is used as parent as param name of the constructor suggests.

                        C Offline
                        C Offline
                        Cuban Akira
                        wrote on 26 Oct 2018, 19:48 last edited by
                        #11

                        @mrjj said in how to modify mainform.ui components from other form, and vice versa:

                        spect

                        //information.cpp constructor

                        informacion::informacion(QWidget *parent) :
                        QDialog(parent),
                        ui(new Ui::informacion)
                        {
                        ui->setupUi(this);

                        Aeropuerto *obj = new Aeropuerto();
                        list<Avion>::iterator it;

                        //visual
                        ui->aerolineaLE->hide();
                        ui->aerolineaEditarLabel->hide();
                        ui->codigoLE->hide();
                        ui->asientosLE->hide();
                        ui->equipajeLE->hide();
                        ui->pilotoLE->hide();
                        ui->editarHeadLine->hide();

                        ui->ok->hide();

                        obj->xt=obj->flotaAviones.begin();

                        ui->aerolinealabel->setText((*obj->xt).getAerolinea());
                        ui->asientosRed->setText(QString::number((*obj->xt).getCantidadAsientos()));
                        ui->asientoslabel->setText(QString::number((*obj->xt).getCantidadAsientos()));
                        ui->equipajelabel->setText(QString::number((*obj->xt).getCapacidadEquipajeRestante()));
                        ui->codigolabel->setText((*obj->xt).getCodigo());
                        ui->pilotolabel->setText((*obj->xt).getNombrePiloto());
                        ui->equipajeNRed->setText(QString::number((*obj->xt).getCapacidadEquipajeRestante()));
                        ui->aerolineaRed->setText((*obj->xt).getAerolinea());

                        //mostrando
                        ui->aerolinealabel->show();
                        ui->codigolabel->show();
                        ui->asientoslabel->show();
                        ui->equipajelabel->show();
                        ui->pilotolabel->show();
                        ui->aerolinealabel->show();
                        ui->aerolineaRed->show();
                        ui->equipajeNRed->show();
                        ui->pushButton->show();
                        ui->pushButton_2->show();
                        ui->editar->show();

                        //numeros rojos
                        if((*obj->xt).getCantidadAsientos()==0)
                        {
                        ui->aerolinealabel->hide();
                        ui->label_4->hide();
                        ui->asientoslabel->hide();
                        }
                        if((*obj->xt).getCapacidadEquipajeRestante()==0)
                        {
                        ui->aerolinealabel->hide();
                        ui->label_3->hide();
                        ui->equipajelabel->hide();
                        }

                        }

                        M 1 Reply Last reply 26 Oct 2018, 19:52
                        0
                        • C Cuban Akira
                          26 Oct 2018, 19:48

                          @mrjj said in how to modify mainform.ui components from other form, and vice versa:

                          spect

                          //information.cpp constructor

                          informacion::informacion(QWidget *parent) :
                          QDialog(parent),
                          ui(new Ui::informacion)
                          {
                          ui->setupUi(this);

                          Aeropuerto *obj = new Aeropuerto();
                          list<Avion>::iterator it;

                          //visual
                          ui->aerolineaLE->hide();
                          ui->aerolineaEditarLabel->hide();
                          ui->codigoLE->hide();
                          ui->asientosLE->hide();
                          ui->equipajeLE->hide();
                          ui->pilotoLE->hide();
                          ui->editarHeadLine->hide();

                          ui->ok->hide();

                          obj->xt=obj->flotaAviones.begin();

                          ui->aerolinealabel->setText((*obj->xt).getAerolinea());
                          ui->asientosRed->setText(QString::number((*obj->xt).getCantidadAsientos()));
                          ui->asientoslabel->setText(QString::number((*obj->xt).getCantidadAsientos()));
                          ui->equipajelabel->setText(QString::number((*obj->xt).getCapacidadEquipajeRestante()));
                          ui->codigolabel->setText((*obj->xt).getCodigo());
                          ui->pilotolabel->setText((*obj->xt).getNombrePiloto());
                          ui->equipajeNRed->setText(QString::number((*obj->xt).getCapacidadEquipajeRestante()));
                          ui->aerolineaRed->setText((*obj->xt).getAerolinea());

                          //mostrando
                          ui->aerolinealabel->show();
                          ui->codigolabel->show();
                          ui->asientoslabel->show();
                          ui->equipajelabel->show();
                          ui->pilotolabel->show();
                          ui->aerolinealabel->show();
                          ui->aerolineaRed->show();
                          ui->equipajeNRed->show();
                          ui->pushButton->show();
                          ui->pushButton_2->show();
                          ui->editar->show();

                          //numeros rojos
                          if((*obj->xt).getCantidadAsientos()==0)
                          {
                          ui->aerolinealabel->hide();
                          ui->label_4->hide();
                          ui->asientoslabel->hide();
                          }
                          if((*obj->xt).getCapacidadEquipajeRestante()==0)
                          {
                          ui->aerolinealabel->hide();
                          ui->label_3->hide();
                          ui->equipajelabel->hide();
                          }

                          }

                          M Offline
                          M Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on 26 Oct 2018, 19:52 last edited by
                          #12

                          @Cuban-Akira
                          Ok, that looks all right as far as i can see.
                          You have to find out what line it crash on so its time to use the debugger and
                          single step through MainWindow and see what makes it crash.
                          Seems to be fine with the connect . So i assume its something else.

                          C 2 Replies Last reply 26 Oct 2018, 20:01
                          0
                          • M mrjj
                            26 Oct 2018, 19:52

                            @Cuban-Akira
                            Ok, that looks all right as far as i can see.
                            You have to find out what line it crash on so its time to use the debugger and
                            single step through MainWindow and see what makes it crash.
                            Seems to be fine with the connect . So i assume its something else.

                            C Offline
                            C Offline
                            Cuban Akira
                            wrote on 26 Oct 2018, 20:01 last edited by
                            #13

                            @mrjj said in how to modify mainform.ui components from other form, and vice versa:
                            when i comment
                            /* informacion info = new informacion(this);
                            connect(ui->pushButton, SIGNAL (click()) , info , SLOT(hideEditar()));
                            /

                            debuging i found why crashes, and fix it, i testing right now

                            1 Reply Last reply
                            1
                            • M mrjj
                              26 Oct 2018, 19:52

                              @Cuban-Akira
                              Ok, that looks all right as far as i can see.
                              You have to find out what line it crash on so its time to use the debugger and
                              single step through MainWindow and see what makes it crash.
                              Seems to be fine with the connect . So i assume its something else.

                              C Offline
                              C Offline
                              Cuban Akira
                              wrote on 29 Oct 2018, 15:52 last edited by
                              #14

                              @mrjj
                              i test the signal slot system in my app, and i have gaps, thing i dont understand yet, i solved all the remaining problem and task taking other ways,
                              i have this questions unclear:
                              1 - if i want to connect a button.clicked() signal to a x slot, i have to declare it(the signal) in the class.h and class.cpp or the moc file create it ???
                              2 - in the funtion connect, i use 4 arguments, (object, signal, recObject, slot ), if the signal es from a button, the object may be the formclass or the button
                              3 - i see a lot examples with the word "emit", i have to use always?, all the bodys of slots funtion may have "emit"?
                              4 - how to create a signal, ?? cause i cannnot implemet a body in the class.cpp, just declare it in the class.h

                              M 1 Reply Last reply 29 Oct 2018, 16:02
                              1
                              • C Cuban Akira
                                29 Oct 2018, 15:52

                                @mrjj
                                i test the signal slot system in my app, and i have gaps, thing i dont understand yet, i solved all the remaining problem and task taking other ways,
                                i have this questions unclear:
                                1 - if i want to connect a button.clicked() signal to a x slot, i have to declare it(the signal) in the class.h and class.cpp or the moc file create it ???
                                2 - in the funtion connect, i use 4 arguments, (object, signal, recObject, slot ), if the signal es from a button, the object may be the formclass or the button
                                3 - i see a lot examples with the word "emit", i have to use always?, all the bodys of slots funtion may have "emit"?
                                4 - how to create a signal, ?? cause i cannnot implemet a body in the class.cpp, just declare it in the class.h

                                M Offline
                                M Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on 29 Oct 2018, 16:02 last edited by mrjj
                                #15

                                Hi
                                1:
                                Always in the .cpp and .h for the slots.
                                the moc files are generated and will override any changes you make for them.
                                Notice that a slot always have its header in .h and the body in .cpp
                                A custom signal on the other hand, only has header in .h as it has no body.
                                Terms used:
                                header = the signature of the function/method/slot like
                                void SomeSlot(int param);
                                Body = the actual implementation of the slot
                                void Classsname::SomeSlot(int param) {
                                ---code--
                                }
                                on the other hand a signal would just be
                                void SomeSignal(int param); in .h and nothing in .cpp.

                                2:
                                You may send a signal to any other class that inherit QObject and has Q_OBJECT macro and the slot that matches
                                class Someclass: public QObject {
                                Q_OBJECT

                                3:
                                emit is used to send the signal.
                                So if you create new signals, its how you "send" them
                                emit MySignal()

                                4:
                                a signal is just a method header/signature and listed under signals:
                                signals:
                                void MySignal(); // your custom signal.

                                Did you read
                                http://doc.qt.io/qt-5/signalsandslots.html
                                ?

                                1 Reply Last reply
                                1

                                9/15

                                26 Oct 2018, 19:34

                                • Login

                                • Login or register to search.
                                9 out of 15
                                • First post
                                  9/15
                                  Last post
                                0
                                • Categories
                                • Recent
                                • Tags
                                • Popular
                                • Users
                                • Groups
                                • Search
                                • Get Qt Extensions
                                • Unsolved