2011-01-07 37 views
10

Tôi có một QHBoxLayout với một QTreeWidget ở bên trái, một dấu phân cách ở giữa và một tiện ích ở bên phải.Làm thế nào để thay thế một Widget bằng cách sử dụng khác bằng cách sử dụng Qt?

Khi tôi bấm vào QTreeWidget, tôi muốn thay đổi widget ở bên phải để thay đổi QTreeWidgetItem

tôi đã cố gắng để làm điều này với mã này:

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) 

Nhưng nó không hoạt động và tất cả các tiện ích được xếp chồng lên nhau:

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

Bạn có biết cách tôi có thể xóa tiện ích con cũ và tiếp theo hiển thị tiện ích con mới không?

Trả lời

16

Giải pháp phổ biến nhất là sử dụng QStackedWidget và đặt tất cả các tiện ích có thể vào ngăn xếp. Khi chọn một mục, chỉ cần gọi setCurrentWidget để hiển thị một mục bạn muốn.

+0

Tốt, tôi sẽ thử. Cảm ơn – Natim

16

Tôi có cùng câu hỏi với Natim.

QStackedWidget là giải pháp cho bố cục đặt trước. Nó hoạt động giống như những điều flippy trong một quán ăn cũ cho một hộp âm nhạc. (X-số lượng album trong máy hát tự động, lật qua các album đã cài đặt).

Tuy nhiên điều này không giải quyết được câu hỏi. Ví dụ tôi có mã tôi đang tạo mẫu với bố cục giao diện người dùng, tuy nhiên tôi muốn thay thế một số tiện ích con hoạt động như trình giữ chỗ với các tiện ích thích hợp được mã hóa trong quá trình thực thi tập lệnh chính hoặc được tạo động .

Tôi chắc chắn có một quy trình đơn giản hoặc báo trước về cách xóa/thay thế tiện ích đúng cách.

Mã tôi có tiện ích textEdit cơ bản trong bố cục lưới. Tôi muốn mã một phiên bản tùy chỉnh của widget này cho kéo và giọt và sau đó trao đổi nó ra với textEdit mặc định.

Giống như Natim, mã có vẻ hợp lý, tuy nhiên các tiện ích được xếp chồng chất nguy hiểm trong bố cục như bán phá giá ví.

Hy vọng có thể tìm ra mẹo để làm điều này và đăng lại báo trước.

GIẢI PHÁP:

Voilà !! Tìm thấy một cái gì đó chắc chắn làm các trick. ĐÓNG tiện ích của bạn

# 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() 

Tôi đã xóa tiện ích khỏi bố cục, sau đó đóng tiện ích. Tại thời điểm này, biến tôi đang sử dụng mở để tạo tiện ích tùy chỉnh/sửa đổi của tôi và sau đó chèn lại vào bố cục

Có một số sự thanh lịch cần thiết để xử lý bố cục phức tạp hơn, nhưng nhu cầu cơ bản của việc hủy một tiện ích để thay thế nó nằm trong phương thức .close()

Chúc mừng .. hy vọng điều này sẽ hữu ích. B

Các vấn đề liên quan