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. [solved] Newb to child parent forms and how to access the ui elements of child forms
Qt 6.11 is out! See what's new in the release blog

[solved] Newb to child parent forms and how to access the ui elements of child forms

Scheduled Pinned Locked Moved General and Desktop
12 Posts 2 Posters 7.8k 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.
  • T Offline
    T Offline
    thistleknot
    wrote on last edited by
    #3

    following a tutorial of Inheritance Approach:

    http://qt-project.org/doc/qt-5/designer-using-a-ui-file.html#the-single-inheritance-approach

    I made an experimental branch on github showcasing the specific changes.

    https://github.com/thistleknot/DiffMatchPatch/commit/b0a7eaede6838916a3dda3b2d652c4b484ba4990

    It compiles, but I still don't know how to access it as

    uiOutput->

    what's missing is diffmatchpatch.cpp line 156

    uiOutput-> doesn't seem to do anything

    I made sure I did a private member var in my diffpatcmatch.h (basically my mainwindow)Ui::PatchOutputWindow *uiOutput;

    I have a plainTextEdit on the uiOutput (patchOutputWindow) interface I'm trying to port a QString to. I was hoping to access it in a fashion similar to ui->.

    That form specifically (uiOutput) has a menubar that I specifically desire, and so I created a form first using the form editor, and was trying to import it as a new window/form into my project.

    Alternatively I could go with a Tabbed window system. That way I wouldn't have to figure out how to implement these new windows so I can gain access to a pre-made form.

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #4

      Hi,

      In good written widgets, child widgets don't know anything about their parent. They provide getter and setters for the internal part they allow to modify. If a parent widget needs to react to something happening inside a child widget, it should connect to a signal emitted by the child widget.

      So if you want to update the content of a QPlainTextEdit, add a setter in your container widget e.g. DiffMatchPatchWidget::setPatchContent(const QString& patchFilePath); and in that method, update your ui->myPlainTextEdit

      Hope it helps

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • T Offline
        T Offline
        thistleknot
        wrote on last edited by
        #5

        what about a signal emitted by the parent widget?

        I have a menu drop down where i'm trying to submit a compute, patch algorithm that dumps to a plainTextEdit, but the plainTextEdit I wanted in a new window, and then the option to save it. It's due to the fact that I'm working with multiple documents of similar nature that I need a new window so a person using the app doesn't get confused (even though it's a patch file vs raw txt data).

        I think I see what you mean. If a parent needs to react...

        In this case the child needs to react... so the child has a getter function.

        I don't know why... but I'm used to calling them member accessor functions. Maybe UML?

        1 Reply Last reply
        0
        • T Offline
          T Offline
          thistleknot
          wrote on last edited by
          #6

          I'm still kind of lost. I'm not trying to update the mainwindow or diffmatchpatch.cpp at all, I'm trying to update patchoutputwindow.cpp with a save slot from diffmatchpatch.cpp. So it's the parent window signalling the child window. So... I would just setup a public function that returns a QString? Then this member function is available by invoking the object and it's object.<function name>?

          1 Reply Last reply
          0
          • T Offline
            T Offline
            thistleknot
            wrote on last edited by
            #7

            Yeah, i'm completely lost.

            I've been working on this all day. My code worked before by pushing objects to a new window that was locally created so I had no issues with encapsulation. But now...

            I tried reading this article and implementing it

            http://qt-project.org/doc/qt-5/signalsandslots.html

            but got stuck here:

            Counter a, b;
            QObject::connect(&a, &Counter::valueChanged,
                             &b, &Counter::setValue);
            
            a.setValue(12);     // a.value() == 12, b.value() == 12
            b.setValue(48);     // a.value() == 12, b.value() == 48
            

            Here's my code (compiles)

            https://github.com/thistleknot/DiffMatchPatch/commit/b0a7eaede6838916a3dda3b2d652c4b484ba4990

            I'm basically trying to emit a QString from one form to another form.

            1 Reply Last reply
            0
            • T Offline
              T Offline
              thistleknot
              wrote on last edited by
              #8

              I think this may be my answer

              http://stackoverflow.com/questions/15833535/transfer-data-between-forms-in-qt

              1 Reply Last reply
              0
              • T Offline
                T Offline
                thistleknot
                wrote on last edited by
                #9

                I got it by creating a public function on the receiving form:

                @
                void setOutputWindowText(QString);

                void PatchOutputWindow::setOutputWindowText(QString outputString) {
                ui->plainTextEditPatchOutput->setPlainText(outputString);
                }
                @

                and calling it

                @
                diff_match_patch dmp;

                QString str1 = ui->plainTextEditLeft->toPlainText();
                QString str2 = ui->plainTextEditRight->toPlainText();

                childForm = new PatchOutputWindow(this);

                //parent window can be in front of child window
                //childForm = new PatchOutputWindow();

                QString strPatch = dmp.patch_toText(dmp.patch_make(str1, str2));
                QTextStream out(&strPatch);

                childForm->setOutputWindowText(strPatch);

                childForm->show();
                @

                [edit: added missing coding tags @ SGaist]

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #10

                  That's it

                  On a side note, why the QTextStream ?

                  Unless you plan to have multiple PatchOutputWindow shown at the same time, you have a design problem here. Each time you will call the second part of your code, you will replace childForm with a new widget.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  0
                  • T Offline
                    T Offline
                    thistleknot
                    wrote on last edited by
                    #11

                    the sample code used QTextStream is why. What do you suggest.

                    I'm aware of the duplicate childforms, not a big concern, but a user may desire to run multiple patches before saving them.

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #12

                      Just that the out variable is never used so there's not need to have it there.

                      Then you should write your code taking that possibility into account

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0

                      • Login

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