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 で記述されているため、ハッキングしたい場合は、関連するコードが にありPyQt4/uic/uiparser.pyます。具体的には、クラスの メソッドcreateSpacersetupObjectメソッドです。UIParserこのsetupObjectメソッドは、オブジェクトの属性を作成するために通常使用されるものですが、明らかにcreateSpacerメソッドは現在それを使用していません。

なぜ現在このように行われているのかわかりません。決定的な回答を得るには、おそらくPyQt メーリング リストでプロジェクト管理者 (Phil Thompson) に質問する必要があります。

また、グリッド レイアウトでのスペーサーの位置がわかっている場合は、次のようにアクセスできます。

self.gridLay.itemAtPosition(row, column).spacerItem()
于 2012-01-08T21:48:41.593 に答える
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 に答える
1

Pyuic4 は、uicオプションがほとんどない Qt ユーティリティの薄いラッパーであり、これはその能力をはるかに超えています。

あなたができることは、慣習的なサブクラスで、そのアイテムへの参照を保存することです(あなたはそれを設計したので、スペーサーがどの行/列にあるかを知っているはずです):

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

とにかく pyuic から出てくるものはすべてサブクラス化する必要があるので、これは大したことではありません。

于 2012-01-08T23:44:08.203 に答える