Đây là một vài năm quá muộn, nhưng tôi đã làm việc trên một tiện ích lớp phủ trong suốt hoàn toàn bao gồm phụ huynh. Bạn không thể làm những gì bạn muốn mà không có phân lớp, nhưng bạn có thể hạn chế phân lớp thành một thể hiện như @reclosedev gợi ý, nghĩa là bạn không phải tạo một lớp con.
tôi đã viết đoạn sau (trong đó hoạt động trong PyQt4) cho sau kích thước của bất kỳ widget widget được thêm vào:
class TransparentOverlay(QtGui.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
self._updateParent(self.parentWidget())
def setParent(self, parent, *args):
prevParent = self.parentWidget()
super().setParent(parent, *args)
self._updateParent(parent, prevParent)
def unsetParent(self, parent=None):
if parent is None:
parent = self.parentWidget()
if parent is not None and hasattr(parent.resizeEvent, '_original'):
parent.resizeEvent = parent.resizeEvent._original
def _updateParent(self, parent, prevParent=None):
if parent is not prevParent:
self.unsetParent(prevParent)
if parent is not None:
original = parent.resizeEvent
def resizeEventWrapper(event):
original(event)
self.resize(event.size())
resizeEventWrapper._original = original
parent.resizeEvent = resizeEventWrapper
self.resize(parent.size())
Mã này sử dụng một vài thủ thuật gọn gàng mà có thể xảy ra với Python:
- Phương thức gốc được lưu giữ trong thuộc tính
_original
của thuộc tính mới. Điều này là có thể bởi vì các hàm là các đối tượng.
- Phương thức mới thực sự phân lớp bất kỳ
QWidget
dụ, có nghĩa là bạn không phải tạo một lớp con thực sự. Mỗi cá thể cha mẹ sẽ có hiệu quả trở thành một thể hiện của một lớp con nhờ vào phương pháp được giải quyết.
Nếu bạn cần điều một lần, tất cả mã để xóa phương thức resizeEvent
được phân lớp và thay thế bằng mã gốc có thể được chuyển vào thùng rác. Trong trường hợp đó, giải pháp cơ bản là một phiên bản fancier của giải pháp @ reclosedev, nhưng với ý kiến của @ Chris về việc bảo quản địa chỉ gốc.
Thông báo trước với mã này là nó không hỗ trợ tiện ích GL chính xác, vì vậy, ví dụ: lớp phủ không phải lúc nào cũng được thêm vào chế độ xem của QGraphicsView
. Nó có thể, tuy nhiên, được thêm vào chính nó là QGraphicsView
.
Nguồn
2016-04-14 18:03:41
Không, bạn không thể. Cách bset là: Tạo QWidget của riêng bạn phát ra Resize trong resizeEvent(), sau đó thúc đẩy các widget của bạn vào nó :) –