Bu, birkaç sene geç kalmıştı, ancak ebeveyni tamamen örten şeffaf bir bindirme widget'ında çalışıyordum. Alt sınıflandırma olmadan istediğiniz şeyi yapamazsınız, ancak alt sınıflamayı bir örnekle @reclosedev önerdiği gibi sınırlayabilirsiniz, yani aslında bir alt sınıf oluşturmak zorunda kalmazsınız. Bu kod Python ile mümkündür düzgün hileler bir çift kullanır
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())
:
Ben Widget eklenir herhangi widget boyutunu aşağıdakiler için (PyQt4 çalışır) aşağıdaki pasajı yazmış:
- Özgün yöntem, yenisi
_original
özniteliğinde saklanır. Bu mümkündür çünkü fonksiyonlar nesnelerdir.
- Yeni yöntem, gerçek bir alt sınıf oluşturmak zorunda olmadığınız anlamına gelen
QWidget
örnek alt sınıflarını gerçekten alt sınıflara ayırır. Her bir üst örnek, tacked yöntemiyle etkin bir şekilde bir alt sınıfın örneği haline gelecektir.
Eğer bir kerelik bir şey gerekiyorsa, sınıflandırma resizeEvent
yöntemi kaldırılması ve orijinal ile değiştirilmesi için tüm kodu çöpe atılan edilebilir. Bu durumda, çözüm temelde @ reclosedev'in çözümünün bir meraklısı versiyonudur, fakat @ Chris'in adreslenmiş orijinali koruma hakkındaki yorumları ile.
Bu koddaki tek uyarı, GL widget'lerini doğru bir şekilde desteklememesidir, örneğin, kaplama her zaman QGraphicsView
görünümüne eklenemez. Bununla birlikte, QGraphicsView
'un kendisine eklenebilir.
geçersiz kılabilirsiniz Hayır, yapamazsın. Bset yolu: ResizeEvent() içinde yeniden boyutlandırılan kendi QWidget'inizi oluşturun, ardından widget'larınızı tanıtın :) –