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 replace QWidget name dynamically with variable
Forum Updated to NodeBB v4.3 + New Features

How to replace QWidget name dynamically with variable

Scheduled Pinned Locked Moved Solved General and Desktop
16 Posts 5 Posters 2.6k Views 2 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.
  • mrjjM mrjj

    Hi
    Cant you just put
    self.dlg.name1
    self.dlg.name2
    etc
    into a list ?

    You can also build this list automatically from DLG
    https://doc.qt.io/qt-5/qobject.html#findChildren

    Q Offline
    Q Offline
    qtnoob420
    wrote on last edited by
    #3

    @mrjj my thought is to get relevant fields that i need to work with from QGIS and then adress my QLineEdits, QCheckboxes, etc with that.

    For every of my input field i have a label too. wouldnt they be found too with "findchildren"?

    jsulmJ 1 Reply Last reply
    0
    • Q qtnoob420

      @mrjj my thought is to get relevant fields that i need to work with from QGIS and then adress my QLineEdits, QCheckboxes, etc with that.

      For every of my input field i have a label too. wouldnt they be found too with "findchildren"?

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #4

      @qtnoob420 If you want to access your widgets using a string then you could simply put your widgets in a dictionary. This would be way faster than using findChildren.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      Q 2 Replies Last reply
      1
      • jsulmJ jsulm

        @qtnoob420 If you want to access your widgets using a string then you could simply put your widgets in a dictionary. This would be way faster than using findChildren.

        Q Offline
        Q Offline
        qtnoob420
        wrote on last edited by
        #5

        @jsulm it's not that i explicitly want to do it that way, but that I don't know any other way. I don't have the experience and the knowledge i guess

        1 Reply Last reply
        0
        • jsulmJ jsulm

          @qtnoob420 If you want to access your widgets using a string then you could simply put your widgets in a dictionary. This would be way faster than using findChildren.

          Q Offline
          Q Offline
          qtnoob420
          wrote on last edited by
          #6

          @jsulm can you provide me any help on how to do that?

          mrjjM JonBJ 2 Replies Last reply
          0
          • Q qtnoob420

            @jsulm can you provide me any help on how to do that?

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #7

            @qtnoob420
            Hi

            Something like

            a_dict = dict()
            a_dict["name"] = self.dlg.name1
            a_dict["name3"] = self.dlg.name2

            and you can look up the self.dlg.name1 widget with "name"

            "name" is the actual name of the widget. (objectname)

            Q 1 Reply Last reply
            1
            • Q qtnoob420

              @jsulm can you provide me any help on how to do that?

              JonBJ Online
              JonBJ Online
              JonB
              wrote on last edited by JonB
              #8

              @qtnoob420
              Python has a dict type, to store an arbitrary set of key-value pairs.

              If you want to do as @jsulm said and "access your widgets using a string" you could do something like:

              widgets = dict()
              widgets["name1"] = self.dlg.name1
              widgets["name2"] = self.dlg.name2
              ...
              

              You can then access, say, self.dlg.name2 via widgets["name2"]. You can also iterate through all of them, keys and values, via

              for key in widgets:
                   print(key, '->', widgets[key])
              

              If you don't want key names you can of course do similar by just storing them in a list/array instead of a dictionary.

              Q 1 Reply Last reply
              2
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #9

                Hi,

                There might be some stuff doable with some Python introspection or even just using QObject's objectName method.

                Can you show the code of the class of your self.dlg variable ?

                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
                • mrjjM mrjj

                  @qtnoob420
                  Hi

                  Something like

                  a_dict = dict()
                  a_dict["name"] = self.dlg.name1
                  a_dict["name3"] = self.dlg.name2

                  and you can look up the self.dlg.name1 widget with "name"

                  "name" is the actual name of the widget. (objectname)

                  Q Offline
                  Q Offline
                  qtnoob420
                  wrote on last edited by
                  #10

                  @mrjj okay i got this so far.
                  now i want to set values of my fields like this...

                  a_dict["name"].setText("some text")
                  

                  but i get the error:

                  a_dict["name"].setText("some text")
                  AttributeError: 'str' object has no attribute 'setText'
                  
                  jsulmJ 1 Reply Last reply
                  0
                  • JonBJ JonB

                    @qtnoob420
                    Python has a dict type, to store an arbitrary set of key-value pairs.

                    If you want to do as @jsulm said and "access your widgets using a string" you could do something like:

                    widgets = dict()
                    widgets["name1"] = self.dlg.name1
                    widgets["name2"] = self.dlg.name2
                    ...
                    

                    You can then access, say, self.dlg.name2 via widgets["name2"]. You can also iterate through all of them, keys and values, via

                    for key in widgets:
                         print(key, '->', widgets[key])
                    

                    If you don't want key names you can of course do similar by just storing them in a list/array instead of a dictionary.

                    Q Offline
                    Q Offline
                    qtnoob420
                    wrote on last edited by
                    #11

                    @JonB i am still not able to address them like i imagine to.
                    if i try to set values of my field like:

                    a_dict["name"].setText("some text")
                    

                    i get the error:

                    AttributeError: 'str' object has no attribute 'setText'
                    
                    1 Reply Last reply
                    0
                    • Q qtnoob420

                      @mrjj okay i got this so far.
                      now i want to set values of my fields like this...

                      a_dict["name"].setText("some text")
                      

                      but i get the error:

                      a_dict["name"].setText("some text")
                      AttributeError: 'str' object has no attribute 'setText'
                      
                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #12

                      @qtnoob420 said in How to replace QWidget name dynamically with variable:

                      a_dict["name"]

                      What did you store there? Can you show how (and what) you set it (a_dict["name"]=...).
                      What does type(a_dict["name"]) print out?
                      It seems you put a string there...

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      Q 1 Reply Last reply
                      0
                      • jsulmJ jsulm

                        @qtnoob420 said in How to replace QWidget name dynamically with variable:

                        a_dict["name"]

                        What did you store there? Can you show how (and what) you set it (a_dict["name"]=...).
                        What does type(a_dict["name"]) print out?
                        It seems you put a string there...

                        Q Offline
                        Q Offline
                        qtnoob420
                        wrote on last edited by
                        #13

                        @jsulm oh youre right. but idk how i could assign them in an other way:

                        i assigned them like:

                        a_dict[attribute] = "self.dlg."+attribute
                        

                        attribute is the name of the attributes from QGIS. and i named my QWidgets in a similar way to match them.

                        jsulmJ 1 Reply Last reply
                        0
                        • Q qtnoob420

                          @jsulm oh youre right. but idk how i could assign them in an other way:

                          i assigned them like:

                          a_dict[attribute] = "self.dlg."+attribute
                          

                          attribute is the name of the attributes from QGIS. and i named my QWidgets in a similar way to match them.

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by jsulm
                          #14

                          @qtnoob420 Well, you are assigning a string. So, how should that work?
                          Why don't you assign self.dlg.attribute? Where attribute is the name of the attribute.
                          Also, what type is self.dlg?

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          Q 1 Reply Last reply
                          0
                          • jsulmJ jsulm

                            @qtnoob420 Well, you are assigning a string. So, how should that work?
                            Why don't you assign self.dlg.attribute? Where attribute is the name of the attribute.
                            Also, what type is self.dlg?

                            Q Offline
                            Q Offline
                            qtnoob420
                            wrote on last edited by
                            #15

                            @jsulm it makes completely sense, i just dont know how :(

                            i tried stuff like...

                            a_dict[attribute] = self.dlg.attribute
                            AttributeError: 'BaumkatasterDialog' object has no attribute 'attribute'
                            
                            
                            feature_dict[attribute] = self.dlg.+attribute
                            SyntaxError: invalid syntax
                            
                            

                            ... which doesnt work either. i just dont know no better

                            i used the PluginBuilder3 so it was created by the plugin. i can access all of my UI Widgets from the QtDesigner with "self.dlg.widget_name"

                            jsulmJ 1 Reply Last reply
                            0
                            • Q qtnoob420

                              @jsulm it makes completely sense, i just dont know how :(

                              i tried stuff like...

                              a_dict[attribute] = self.dlg.attribute
                              AttributeError: 'BaumkatasterDialog' object has no attribute 'attribute'
                              
                              
                              feature_dict[attribute] = self.dlg.+attribute
                              SyntaxError: invalid syntax
                              
                              

                              ... which doesnt work either. i just dont know no better

                              i used the PluginBuilder3 so it was created by the plugin. i can access all of my UI Widgets from the QtDesigner with "self.dlg.widget_name"

                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #16

                              @qtnoob420 As I said: use real name of the attribute, not the word "attribute". Example: if you have attribute called "a" then do:

                              a_dict[attribute] = self.dlg.a
                              

                              But it seems that you only have strings containing attribute names, right?
                              Then you could do it like this:

                              f = getattr(self.dlg, attribute)
                              f() # Here we call attribute
                              

                              You do not even need a dictionary.
                              One example for string in Python:

                              s="abc"
                              f=getattr(s, "upper")
                              f() # prints ABC
                              

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1

                              • Login

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