2012-01-08 7 views
1

pyuic4に.pyファイルのクラスメンバーとしてQSpacerItemを強制的に生成させる方法はありません。他のすべては、どのようにそれを修正するために、たとえば、クラスのメンバーとしてQSpacerItemPyQt4 pyuic4 spacerItemクラスのメンバーとして

spacerItem = QtGui.QSpacerItem(20, 0, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) 
self.gridLay.addItem(spacerItem, 0, 2, 1, 1) 

任意のアイデアを除き、GridLayoutの

self.gridLay = QtGui.QGridLayout() 

すべてを生成しているのですか?

PS手動で修正する方法は問いません)。

答えて

1

pyuic4インターフェイスでこの動作を変更することはできません。

しかし、pyuic4はPyQtで書かれているので、ハッキングしたいと思えば、関連コードはPyQt4/uic/uiparser.pyです。具体的には、UIParserクラスのcreateSpacerおよびsetupObjectの方法。 setupObjectメソッドは、オブジェクトの属性を作成するために通常使用されるメソッドですが、明らかにcreateSpacerメソッドは現在そのメソッドを使用していません。

私は物事が現在このように行われている理由はわかりません。決定的な回答を得るには、プロジェクト管理者(Phil Thompson)にPyQt Mailing Listと尋ねなければならないでしょう。

はまた、あなたは、グリッドレイアウト内のスペーサーの位置を知っていれば、あなたはこのようにアクセスすることができ、ことに注意してください:

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

Pyuic4は非常に持っているのQt uicユーティリティの上に薄いラッパーであり、いくつかの選択肢があり、これはその能力を超える方法です。

あなたは、慣例サブクラスで、その項目への参照を保存するためにされて何ができるか(あなたは、スペーサがある行/列に知ることになっているので、あなたは、ものを設計しました):

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

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

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) 

ありがとうございました!

関連する問題