2017-08-02 72 views
-2

我试图改变QT中的某些字段。使用setattr()访问动态方法

这是代码:

req_fields = ["first_name", "last_name", "street", "city"] 
for field in req_fields: 
    if getattr(self, field).text() == "": 
     setattr(self, field, setStyleSheet("QLineEdit{ border : 2px solid red;}")) 
     setattr(self, field, setText("test")) 

我得到的错误:

setattr(self, field, setStyleSheet("QLineEdit { border : 2px solid red;}")) 
NameError: name 'setStyleSheet' is not defined 

我不明白为什么getattr功能的工作原理,以及setattr没有。

如果我手动使用:

self.first_name.setStyleSheet("QLineEdit { border : 2px solid red;}") 

我得到预期的结果。

+4

这有什么好做GETATTR或SETATTR。由于错误日期,这是您尝试调用以将结果发送到setattr - setStyleSheet - 未定义的事情。 –

+0

但为什么我可以直接使用setStyleSheet? – Johny

+1

这甚至不是'setattr'的工作。您没有执行属性分配。这是'getattr'的工作,就像你对'getattr(self,field).text()'所做的一样。不要紧,'setStyleSheet'在名字中有'set'。 – user2357112

回答

1

当您在setattr()中使用setStyleSheet时,它被视为全局变量(未定义)。当您使用self.first_name.setStyleSheet时,术语setStyleSheet被视为(正确)为self.first_name的属性。

我没有安装QT,但觉得像这样的工作:

req_fields = ["first_name", "last_name", "street", "city"] 
for fieldname in req_fields: 
    field = getattr(self, field) 
    if field.text() == "": 
     field.setStyleSheet("QLineEdit { border: 2px solid red;}") 
     field.setText("test") 
+0

谢谢。代码起作用。 – Johny

+0

这是个好消息......在这种情况下,请接受我的回答。请参阅[_当有人回答我的问题时该怎么办?_](http://stackoverflow.com/help/someone-answers) – martineau