2011-01-07 3 views
10

왼쪽에는 QTreeWidget, 중간에는 구분 기호, 오른쪽에는 위젯이있는 QHBoxLayout이 있습니다. 나는 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 레이아웃으로 프로토 타입을 작성하는 코드가 있지만 기본 스크립트 실행 중에 코딩되거나 동적으로 생성 된 적절한 위젯으로 자리 표시 자 역할을하는 위젯 중 일부를 대체하려고합니다 .

위젯을 올바르게 제거/교체하는 방법에 대한 간단한 절차 또는주의 사항이 있습니다.

내가 가지고있는 코드에는 그리드 레이아웃에 기본 텍스트 편집 위젯이 있습니다. 드래그 앤 드랍을 위해이 위젯의 ​​커스텀 버전을 코딩하고 기본 텍스트 에디트로 스왑하려고합니다.

Natim처럼 코드는 논리적으로 건전하지만, 위젯은 지갑을 버리는 것처럼 레이아웃에 쌓여 있습니다.

이 트릭을 알아 내고주의 사항을 다시 게시하십시오.

해결 방법 :

보라! 트릭을 확실히하는 것을 발견했습니다. 위젯을 닫으십시오.

# 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

관련 문제