जब विजेट का आकार बदलता था तो मैं एक कार्रवाई करना चाहता हूं।QWidget सिग्नल का आकार बदलें?
क्या उस विजेट पर एक ईवेंट फ़िल्टर इंस्टॉल किए बिना इसे पकड़ने का कोई तरीका है (और जाहिर है, बिना सबक्लासिंग के)? AFAIK, QWidget में resized
सिग्नल नहीं है।
जब विजेट का आकार बदलता था तो मैं एक कार्रवाई करना चाहता हूं।QWidget सिग्नल का आकार बदलें?
क्या उस विजेट पर एक ईवेंट फ़िल्टर इंस्टॉल किए बिना इसे पकड़ने का कोई तरीका है (और जाहिर है, बिना सबक्लासिंग के)? AFAIK, QWidget में resized
सिग्नल नहीं है।
आप किसी भी अन्य QObject कि कि करने के लिए सख्त संबंध QWidget आप QObject::installEventFilter(QObject * filter)
और अधिभार bool eventFilter(QObject *, QEvent *)
उपयोग कर सकते हैं हो सकता है है, तो कर सकते हैं। यह sublclassing बिना Qt docs
आप widget
वर्ग से निकाले जाते हैं और resizeEvent
घटना reimplement
ध्यान दें कि वारवरुक ने लिखा "और, जाहिर है, इसे बिना वर्गीकृत किए" –
@KamilKlimek, ...जवाब देने के बाद :) – Lol4t0
ने यह नहीं देखा कि, मेरा बुरा –
पर जितना अधिक आप PyQt4 साथ अजगर का उपयोग कर रहे मामले में, आप अपने कार्य करने के लिए widget.resizeEvent
सेट कर सकते हैं देखें:
#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui
def onResize(event):
print event
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
widget = QtGui.QPushButton('Test')
widget.resizeEvent = onResize
widget.resize(640, 480)
widget.show()
sys.exit(app.exec_())
यह resizeEvent के बेस क्लास कार्यान्वयन को चलाने से रोकता है। यह कुछ महत्वपूर्ण कर रहा है। और बंदर-पैच समाधान के साथ, आपको मूल विधि के संदर्भ को एक अलग चर के रूप में रखना होगा। गंदा। – Chris
@Chris दस्तावेज़ों का कहना है कि समय के आकार के बाद एवेन्ट को पहले से ही अपनी नई ज्यामिति कहा जाता है, इसलिए यदि आपके पास मुख्य विजेट पर कुछ और करने की ज़रूरत नहीं है तो आप केवल फ़ंक्शन को ओवरराइड कर सकते हैं। मैं इस तकनीक का उपयोग QScrollArea की सामग्री का आकार बदलने के लिए करता हूं। – blameless75
क्षमा करें, यह एक हैक की तरह लग रहा है, लेकिन मैं इस का उपयोग करें:
some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)
पायथन के लिए बहुत कुछ के लिए डिजाइन किया जा रहा है। हालांकि, सुपर कार्यान्वयन को बनाए रखने के लिए +1। –
यह कुछ वर्षों से बहुत देर हो चुकी है, लेकिन मैं एक पारदर्शी ओवरले विजेट पर काम कर रहा था जो पूरी तरह से माता-पिता को कवर करेगा। आप उपclassing के बिना जो भी चाहते हैं वह नहीं कर सकते हैं, लेकिन आप subclassing को एक उदाहरण के रूप में प्रतिबंधित कर सकते हैं जैसे @reclosedev सुझाव देता है, जिसका अर्थ है कि आपको वास्तव में उप-वर्ग बनाना नहीं है।
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())
इस कोड को साफ चाल है कि अजगर के साथ संभव हो रहे हैं की एक जोड़ी का उपयोग करता है:
मुझे लगता है कि विजेट में जोड़ा जाता है किसी भी विजेट का आकार निम्न के लिए निम्नलिखित स्निपेट (जो PyQt4 में काम करता है) ने लिखा है:
_original
नई विशेषता का विशेषता है। यह संभव है क्योंकि कार्य वस्तुएं हैं।QWidget
उदाहरण का उप-वर्ग है, जिसका अर्थ है कि आपको वास्तविक उप-वर्ग बनाना नहीं है। प्रत्येक पैरेंट इंस्टेंस प्रभावी ढंग से विधिबद्ध तरीके के आधार पर उप-वर्ग का उदाहरण बन जाएगा।आप एक बार की बात की जरूरत है, subclassed resizeEvent
विधि को दूर करने और मूल इसकी जगह के लिए कोड के सभी ट्रैश किए जा सकता है। उस स्थिति में, समाधान मूल रूप से @ reclosedev के समाधान का एक प्रशंसक संस्करण है, लेकिन मूल पते को संरक्षित करने के बारे में @ क्रिस की टिप्पणियों के साथ।
इस कोड के साथ एकमात्र चेतावनी यह है कि यह जीएल विजेट्स का सही ढंग से समर्थन नहीं करता है, उदाहरण के लिए ओवरले को QGraphicsView
के व्यूपोर्ट में हमेशा जोड़ा नहीं जा सकता है। हालांकि, इसे QGraphicsView
में जोड़ा जा सकता है।
आप resizeEvent
def resizeEvent(self, newSize):
#do code here
ओवरराइड नहीं, आप नहीं कर सकते हैं कर सकते हैं। बास्केट तरीका है: अपना स्वयं का QWidget बनाएं जो resizeEvent() में आकार बदलता है, फिर अपने विजेट को प्रचारित करें :) –