2017-08-02 71 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