2011-01-07 19 views
10

QHBoxLayoutは左にQTreeWidget、中央にセパレータ、右にウィジェットがあります。私はQTreeWidgetをクリックするとQtを使ってウィジェットを別のウィジェットに置き換えるには?

は、私はこのコードでこれを実行しようとしましたQTreeWidgetItem

を修正するために、右側にウィジェットを変更したい:

def new_rendez_vous(self): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

def edit(self, category, rendez_vous): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent, category, rendez_vous) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

def edit_category(self, category): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = CategoryManagerDialog(self.parent, category) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

しかし、それは動作しません。すべてのウィジェットは互いに積み重なっています:

Exemple of the bug http://hubscher.remy.free.fr/tally/images/2011/01/07/CaptureDescribingTheBug525.jpg

古いウィジェットを削除して次に新しいウィジェットを表示する方法を知っていますか?

答えて

16

最も一般的な解決策は、QStackedWidgetを使用して、すべての可能なウィジェットをスタックに入れることです。アイテムを選択するときは、setCurrentWidgetを呼び出して目的のアイテムを表示してください。

+0

ニース、私はそれを試してみましょう。ありがとう – Natim

16

私はNatimと同じ質問があります。

QStackedWidgetは、プリセットレイアウトのソリューションです。それはオルゴールのための古い食堂でちらっとのように行動します。 (X-ジュークボックス内のアルバムの数、インストールされたアルバムを裏返す)。

しかし、これは問題を解決しません。

たとえば、UIレイアウトでプロトタイプを作成するコードがありますが、プレースホルダとして機能するウィジェットの一部を、プライマリスクリプトの実行中にコード化された、または動的に作成されたウィジェットに置き換える必要があります。

ウィジェットを適切に削除/置き換える方法については、簡単な手順や注意が必要です。

私が持っているコードには、グリッドレイアウトの基本的なテキスト編集ウィジェットがあります。私はドラッグアンドドロップのためのこのウィジェットのカスタムバージョンをコーディングし、次にそれをデフォルトのtextEditと交換したいと思います。

Natimのように、コードは論理的に見えますが、ウィジェットは財布を投棄するようなレイアウトで積み重ねられます。

うまくいけば、このトリックを見つけて、警告を再投稿することができます。

解決策:

Voilà!!そのトリックを確実にしているものを見つけました。ウィジェットを閉じる

# Remove, Create, Replace 
    self.ui.gridLayout.removeWidget(self.ui.dragDataEdit) 
    self.ui.dragDataEdit.close() 
    self.ui.dragDataEdit = myDumpBox(self.ui.centralwidget) 
    self.ui.gridLayout.addWidget(self.ui.dragDataEdit, 0, 0, 1, 1) 
    self.ui.gridLayout.update() 

私はレイアウトからウィジェットを削除してからウィジェットを閉じました。この時点で私が使用している変数はカスタム/変更されたウィジェットを作成してレイアウトに再挿入するために開いています

はいもっと複雑なレイアウトに対処するにはもう少しエレガンスが必要ですが、それを置き換えるためのウィジェットは.close()メソッドにあります。

乾杯してください。 B

関連する問題