Tôi đang cố gắng xóa tiện ích con Qt khỏi bố cục trong ứng dụng PySide.PySide: Xóa tiện ích khỏi bố cục
Dưới đây là ví dụ tối thiểu. Nó là một tiện ích với 5 nút trong nó, và một trong những trung được cho là để loại bỏ bản thân khi nhấp:
Nút là không thể nhấp vào và rõ ràng:
import sys
from PySide import QtGui
app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
buttons = [QtGui.QPushButton(str(x)) for x in xrange(5)]
def deleteButton():
b = layout.takeAt(2)
buttons.pop(2)
del b
buttons[2].clicked.connect(deleteButton)
map(layout.addWidget, buttons)
widget.setLayout(layout)
widget.show()
app.exec_()
Điều gì thực sự xảy ra đây là không được xem xét cho các tính toán bố cục, nhưng hình ảnh của nó vẫn được giữ nguyên.
Theo Qt documentation, đúng cách xóa tất cả các đối tượng từ một bố trí là:
while ((child = layout->takeAt(0)) != 0) {
delete child;
}
Ở đây tôi chỉ muốn xóa nút thứ ba, vì vậy tôi chỉ cần gọi takeAt(2)
, và sau đó del b
để gọi destructor trên mục đó. Đối tượng nút cũng là .pop
'd từ danh sách buttons
để đảm bảo không có tham chiếu còn sót lại cho đối tượng. Mã của tôi khác với mã trong tài liệu Qt có thể gây ra hành vi như thế nào?
Tôi chỉ muốn chúc mừng bạn về một câu hỏi được hình thành thực sự tốt. Gần đây tôi đã thấy rất nhiều điều đơn giản chỉ là một vài câu không có ngữ cảnh, hoặc, một số lượng lớn mã mà chúng tôi dự kiến sẽ đọc. Điều này có một vấn đề rất rõ ràng, cùng với một ví dụ mã rất ngắn gọn và chạy được. Hình ảnh của bạn cũng làm rõ vấn đề hơn nữa. Và bạn cho thấy những gì bạn đã thử. Bravo! – jdi