PyQt4 pyuic4 spacerItem как член класса - PullRequest
1 голос
/ 09 января 2012

Я понятия не имею, как заставить 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 Iне спрашивайте, как это исправить вручную;).

Ответы [ 3 ]

1 голос
/ 09 января 2012

Pyuic4 - это тонкая оболочка над утилитой Qt uic, у которой очень мало опций, и это далеко за пределами ее возможностей.

В обычном подклассе вы можете сделатьсохраните ссылку на этот элемент (вы спроектировали эту вещь, поэтому вы должны знать, в какой строке / столбце находится разделитель):

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

Вы действительно должны в любом случае создавать подклассы для всего, что выходит из pyuicтак что это не должно иметь большого значения.

1 голос
/ 10 января 2012

С вашими советами я нашел решение. Я немного модифицирую 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 голос
/ 09 января 2012

Вы ничего не можете сделать, чтобы изменить это поведение через интерфейс pyuic4.

Тем не менее, pyuic4 написано на PyQt, поэтому, если вы хотите взломать, соответствующий код находится в PyQt4/uic/uiparser.py. В частности, методы createSpacer и setupObject класса UIParser. Метод setupObject - это то, что обычно используется для создания атрибутов объектов, но, очевидно, метод createSpacer в настоящее время не использует его.

Я не уверен, почему в настоящее время все происходит именно так. Чтобы получить окончательный ответ, вам, вероятно, придется обратиться к сопровождающему проекта (Филу Томпсону) в список рассылки PyQt .

Также обратите внимание, что, если вы знаете положение разделителя в сетке, вы можете получить к нему доступ следующим образом:

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