1

我不知道如何强制 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我不问如何手动更正它;)。

4

3 回答 3

1

您无法通过pyuic4界面更改此行为。

但是,pyuic4它是用 PyQt 编写的,所以如果你喜欢 hack,相关代码在PyQt4/uic/uiparser.py. 具体来说,类的createSpacersetupObject方法UIParser。该setupObject方法通常用于为对象创建属性,但显然该createSpacer方法当前不使用它。

我不确定为什么目前以这种方式完成事情。要获得明确的答案,您可能需要询问PyQt 邮件列表上的项目维护者 (Phil Thompson) 。

另请注意,如果您知道分隔符在网格布局中的位置,您可以像这样访问它:

self.gridLay.itemAtPosition(row, column).spacerItem()
于 2012-01-08T21:48:41.593 回答
1

Pyuic4 是 Qt 实用程序之上的一个精简包装器uic,它的选项很少,这超出了它的能力。

你可以做的是,在习惯子类中,保存对该项目的引用(你已经设计了这个东西,所以你应该知道间隔符在哪一行/哪一列):

# somewhere in your __init__(), *after* calling super()
self.spacerItem = self.gridLay.itemAtPosition ( row, column )

无论如何,您确实应该将任何来自 pyuic 的东西子类化,所以这应该没什么大不了的。

于 2012-01-08T23:44:08.203 回答
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)

感谢帮助!

于 2012-01-09T23:03:23.333 回答