Tôi đang cố gắng đặt QVBoxLayout
bên trong QScrollArea
để có thể cuộn theo chiều dọc. Tuy nhiên các mục dường như không được thêm vào nó.Cách tạo QVBoxLayout có thể cuộn?
Tôi thấy một gợi ý rằng tôi nên tạo một widget bên trong mà ScrollArea sử dụng và đặt bố cục bên trong, mặc dù nó dường như không hoạt động. Cấu trúc của tôi có nghĩa vụ phải trông như thế này:
+-------------------------------
| QScrollArea(realmScroll)
| +----------------------------
| | QWidget(realmScrollInner)
| | +-------------------------
| | | QVBoxLayout(realmLayout)
Và mã để làm điều này:
# Irrelevant, added for context (this works)
centralWidget = QWidget(self)
self.container = QVBoxLayout(centralWidget)
centralWidget.setLayout(self.container)
self.setCentralWidget(centralWidget)
# Where trouble starts
self.realmScroll = QScrollArea(self.container.widget())
self.realmScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.realmLayout = QVBoxLayout(self.container.widget())
self.realmScrollInner = QWidget(self.realmScroll)
self.realmScrollInner.setLayout(self.realmLayout)
self.realmScroll.setWidget(self.realmScrollInner)
self.container.addWidget(self.realmScroll)
# Doesn't add to realmLayout
self.realmLayout.addWidget(QLabel("test"))
tôi vẫn đang học Qt (trong 2 ngày), vì vậy trong sâu câu trả lời cho nơi tôi sai lầm sẽ được đánh giá cao.
Cập nhật:
Dường như addWidget(QLabel())
công trình phải lên cho đến khi realmScrollInner
đã được thiết lập như realmScroll
's widget. Kể từ khi tôi muốn thêm các yếu tố sau giao diện người dùng đã được hiển thị tôi phải làm điều này, điều mà tôi không chắc chắn là thực sự đúng:
self.realmLayout.addWidget(QLabel("test"))
# realmScrollInner bound to realmScroll
realmScroll.setWidget(realmScrollInner)
self.container.addWidget(realmScroll)
# Access realmScroll's widget and then layout to add
realmScroll.widget().layout().addWidget(QLabel("test"))
Nhưng nếu bạn loại bỏ cuộc gọi đầu tiên để addWidget
trước widget có bị ràng buộc (do đó bố cục không có tiện ích con), sau đó liên kết với các tiện ích ScrollArea được thêm vào sau đó sẽ không được hiển thị. Có lẽ ScrollArea cần sơn lại (mặc dù tôi không thấy một phương pháp cho điều đó)?
Cập nhật 2: Gọi repaint()
trên realmScroll hoặc tiện ích con được chứa không có gì, cũng như gọi activate/update()
trên bố cục.
Tôi chỉ có một vấn đề rất giống với vấn đề này; xem giải pháp tại đây: http://stackoverflow.com/q/12781407/432913 – will