我不知道如何强制pyuic4生成QSpacerItem作为.py文件中的类成员。其他所有内容都是作为类的成员生成的,例如gridLayout
self.gridLay = QtGui.QGridLayout()
除QSpacerItem之外的所有内容
spacerItem = QtGui.QSpacerItem(20, 0, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
self.gridLay.addItem(spacerItem, 0, 2, 1, 1)
知道如何纠正吗?
PS我不会问如何手动纠正它;)。
答案 0 :(得分:1)
您无法通过pyuic4
界面更改此行为。
但是,pyuic4
是用PyQt编写的,所以如果你觉得自己喜欢黑客攻击,那么相关的代码就在PyQt4/uic/uiparser.py
中。具体而言,createSpacer
类的setupObject
和UIParser
方法。 setupObject
方法通常用于为对象创建属性,但显然createSpacer
方法当前不使用它。
我不确定为什么目前这样做的事情。要获得明确的答案,您可能需要在PyQt Mailing List上询问项目维护者(Phil Thompson)。
另请注意,如果您知道间隔符在网格布局中的位置,则可以像这样访问它:
self.gridLay.itemAtPosition(row, column).spacerItem()
答案 1 :(得分:1)
Pyuic4是Qt uic
实用程序之上的一个瘦包装器,它只有很少的选项,这超出了它的能力。
你可以做的是,在惯用的子类中,保存对该项的引用(你设计了这个东西,所以你应该知道间隔符在哪一行/列上):
# somewhere in your __init__(), *after* calling super()
self.spacerItem = self.gridLay.itemAtPosition ( row, column )
你真的应该把任何来自pyuic的东西都归类,所以这不应该是一个大问题。
答案 2 :(得分:1)
根据您的建议,我找到了解决方案。我稍微修改了PyQt4 / uic / uiparser.py。
361 def createSpacer(self, elem):
362 name = elem.attrib.get('name') #get the name
363 width = elem.findtext("property/size/width")
364 height = elem.findtext("property/size/height")
365
366 if width is None or height is None:
367 size_args = ()
368 else:
369 size_args = (int(width), int(height))
370
371 sizeType = self.wprops.getProperty(elem, "sizeType",
372 QtGui.QSizePolicy.Expanding)
373
374 policy = (QtGui.QSizePolicy.Minimum, sizeType)
375
376 if self.wprops.getProperty(elem, "orientation") == QtCore.Qt.Horizontal:
377 policy = policy[1], policy[0]
378
379 spacer = self.factory.createQObject("QSpacerItem",
380 self.uniqueName(name), size_args + policy,
381 is_attribute=True) #is_attribute=True + set name
382
383 if self.stack.topIsLayout():
384 lay = self.stack.peek()
385 gp = elem.attrib["grid-position"]
386
387 if isinstance(lay, QtGui.QFormLayout):
388 lay.setItem(gp[0], self._form_layout_role(gp), spacer)
389 else:
390 lay.addItem(spacer, *gp)
感谢您的帮助!