PyQt4 pyuic4 spacerItem 作为类的成员

1 投票
3 回答
1067 浏览
提问于 2025-04-17 09:49

我不知道怎么让pyuic4在生成的.py文件中把QSpacerItem当作类的成员来生成。其他的,比如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 我不是在问怎么手动修正这个问题;)

3 个回答

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)

谢谢你的帮助!

1

Pyuic4 是一个简单的工具,它是在 Qt 的 uic 工具之上做的一个小包装,这个工具的选项非常有限,所以它的功能也比较简单。

你可以在通常的子类中,保存对那个项目的引用(因为你是设计这个东西的人,所以你应该知道那个间隔器在第几行第几列):

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

其实你无论如何都应该对从 pyuic 生成的任何东西进行子类化,所以这应该不是个大问题。

1

通过 pyuic4 这个工具,你无法改变它的行为。

不过,pyuic4 是用 PyQt 写的,如果你想动手改改的话,相关的代码在 PyQt4/uic/uiparser.py 里。具体来说,UIParser 类里的 createSpacersetupObject 方法。通常情况下,setupObject 方法是用来为对象创建属性的,但显然 createSpacer 方法现在并没有使用它。

我不太清楚为什么现在是这样做的。如果想要确切的答案,可能需要去问这个项目的维护者(Phil Thompson),可以在 PyQt 邮件列表 上询问。

另外,如果你知道间隔器在网格布局中的位置,可以这样访问它:

self.gridLay.itemAtPosition(row, column).spacerItem()

撰写回答