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.
  • Q Offline
    Q Offline
    qtnoob420
    wrote on last edited by qtnoob420
    #1

    i am working on little qgis extension with a better ui for the users and i am stuck on the QWidgets and getting the information i want into them
    So basically i am trying to simplify my stupidly (but working) repetitive code with some loops. i am trying to replace the QWidget names with a variable[i] in my loop

    layer = self.iface.activeLayer()
    selected_features = layer.selectedFeatures()
    
       for feature in selected_features:
       	feature_values = feature.attributes()
           feature_names = feature.fields()
           attributes = feature_names.names()
    
       	i = 0
           for attribute in attributes:
       		print(attribute + " " + str(feature_values[i])) 
       		#print name and value of a feature into the qgis console for reference
    
               try:
                   #problematic part
                   test = "self.dlg."+attribute+".setText(str("+feature_values[i]+"))"
                   print (test)
       			
               except:
                   print("QWidget does not exist") 
       			
               else:
                   print("QWidget does exist")
    

    currently i fill the values into QWidgets like this...

    self.dlg.name1.setText(str(feature_value["name1"]))
    self.dlg.name2.setText(str(feature_value["name2"]))
    ...
    

    and want to replace it with something like:

    self.dlg.variable[i].setText(str(feature_value["name1"]))
    self.dlg.variable[i].setText(str(feature_value["name2"]))
    ...
    

    i hope i made the point, where i am stuck at, clear

    Thanks in advance :)

    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
      • mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #2

        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 1 Reply Last reply
        0
        • 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 Offline
                    JonBJ Offline
                    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