2014-09-18 35 views
2

我使用PySide不同的对象地址,我得到一个警告,当我尝试到电子表格设置为某个Widget:警告似乎指向

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 2014-09-18 15:40:15

+0

@mdurrant“样式表”只是一个字符串。不,该字符串的地址将是第三个单独的值。此外,警告声称“...的小部件0x1cbecc0”... – 2014-09-18 15:46:14

回答

0

它看起来像原来的警告来自Qt,所以消息中给出的小部件地址是基础C++对象。你显示的其他消息大概来自python,因此显示了pyside包装器对象的地址。

可以使用shiboken module(或sip module的PyQt的),以获得关于底层C++对象的信息:

>>> 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 

gc module梳理这一点,就可以找到从C python封装对象++地址与这样的功能:

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++地址。 – 2014-09-19 08:41:46