2014-09-18 2 views
2

다른 객체의 주소를 가리 키도록 보인다 내가 어떤 위젯 스프레드 시트를 설정하려고 할 때 경고를 얻을 :경고 내가 PySide를 사용하고

09-18 14:48:54,107 WARNING [D=0x7ff4a0074650:qt] Could not parse stylesheet of widget 0x1cbecc0 

나는 문제의 위치를 ​​정확히 지적했습니다 그것을 고정,하지만 난 setStyleSheet()를 호출하는 객체의 주소가 다른 것을보고 놀랐습니다 : 나는 위의 같은 경고를 얻을 때

<views.hierarchy.TreeView object at 0x7f3ab8139440> 

가 이상적으로, 내가 here 같은 역 참조 할 수 바라고에 대한 자세한 내용을 보려면 그 원인.

내 질문 :

  • 왜 두 개의 주소가 다르다?

  • 위젯의 경고에 주소를 가져 오는 방법이 있습니까? 개체입니까?

  • 경고의 주소를 직접 참조 해제 할 방법이 있습니까?

+0

하나의 주소는 위젯이고 하나는 스타일 시트입니까? – mdurant

+0

@mdurrant "스타일 시트"는 문자열입니다. 그리고 아니요. 문자열의 주소는 세 번째 값입니다. 게다가, 경고는 "... 위젯 0x1cbecc0"을 요구합니다 ... –

답변

0

원본 경고가 Qt에서 오는 것처럼 보이므로 메시지에 주어진 위젯 주소가 기본 C++ 객체 용입니다. 당신이 보았던 다른 메시지는 아마도 파이썬에서 왔을 것이므로 pyside 래퍼 객체의 주소를 보여줍니다.

당신은 기본 C++ 객체에 대한 정보를 얻을 수있는 shiboken module (또는 PyQt는 대한 sip module)를 사용할 수 있습니다 다음 gc module으로이 빗질

>>> import shiboken 
>>> from PySide import QtGui 
>>> app = QtGui.QApplication([]) 
>>> w = QtGui.QWidget() 
>>> repr(w) 
'<PySide.QtGui.QWidget object at 0x7f7398c1d950>' 
>>> w.setStyleSheet('{') 
Could not parse stylesheet of widget 0x12e2fc0 
>>> print(shiboken.dump(w)) 
C++ address....... PySide.QtGui.QWidget/0x12e2fc0 
hasOwnership...... 1 
containsCppWrapper 1 
validCppObject.... 1 
wasCreatedByPython 1 

>>> hex(shiboken.getCppPointer(w)[0]) 
>>> 0x12e2fc0 

를, C에서 파이썬 래퍼 개체를 찾을 수 있습니다 ++ 주소는 다음과 같습니다 :

import gc, shiboken 

def wrapper_from_address(address): 
    for item in gc.get_objects(): 
     try: 
      if address == shiboken.getCppPointer(item)[0]: 
       return item 
     except TypeError: 
      pass 
+0

고마워요! 그것이 바로 내가 필요로하는 것입니다. 나는'gc.get_objects()'를 알고 있었지만 C++ 주소에 연결할 수 없었다. –

관련 문제