2012-01-21 17 views
18

जब विजेट का आकार बदलता था तो मैं एक कार्रवाई करना चाहता हूं।QWidget सिग्नल का आकार बदलें?

क्या उस विजेट पर एक ईवेंट फ़िल्टर इंस्टॉल किए बिना इसे पकड़ने का कोई तरीका है (और जाहिर है, बिना सबक्लासिंग के)? AFAIK, QWidget में resized सिग्नल नहीं है।

+4

ओवरराइड नहीं, आप नहीं कर सकते हैं कर सकते हैं। बास्केट तरीका है: अपना स्वयं का QWidget बनाएं जो resizeEvent() में आकार बदलता है, फिर अपने विजेट को प्रचारित करें :) –

उत्तर

11

आप किसी भी अन्य QObject कि कि करने के लिए सख्त संबंध QWidget आप QObject::installEventFilter(QObject * filter) और अधिभार bool eventFilter(QObject *, QEvent *) उपयोग कर सकते हैं हो सकता है है, तो कर सकते हैं। यह sublclassing बिना Qt docs

17

आप widget वर्ग से निकाले जाते हैं और resizeEvent घटना reimplement

+0

ध्यान दें कि वारवरुक ने लिखा "और, जाहिर है, इसे बिना वर्गीकृत किए" –

+0

@KamilKlimek, ...जवाब देने के बाद :) – Lol4t0

+0

ने यह नहीं देखा कि, मेरा बुरा –

9

पर जितना अधिक आप 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_()) 
+5

यह resizeEvent के बेस क्लास कार्यान्वयन को चलाने से रोकता है। यह कुछ महत्वपूर्ण कर रहा है। और बंदर-पैच समाधान के साथ, आपको मूल विधि के संदर्भ को एक अलग चर के रूप में रखना होगा। गंदा। – Chris

+2

@Chris दस्तावेज़ों का कहना है कि समय के आकार के बाद एवेन्ट को पहले से ही अपनी नई ज्यामिति कहा जाता है, इसलिए यदि आपके पास मुख्य विजेट पर कुछ और करने की ज़रूरत नहीं है तो आप केवल फ़ंक्शन को ओवरराइड कर सकते हैं। मैं इस तकनीक का उपयोग QScrollArea की सामग्री का आकार बदलने के लिए करता हूं। – blameless75

2

क्षमा करें, यह एक हैक की तरह लग रहा है, लेकिन मैं इस का उपयोग करें:

some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent) 
+2

पायथन के लिए बहुत कुछ के लिए डिजाइन किया जा रहा है। हालांकि, सुपर कार्यान्वयन को बनाए रखने के लिए +1। –

2

यह कुछ वर्षों से बहुत देर हो चुकी है, लेकिन मैं एक पारदर्शी ओवरले विजेट पर काम कर रहा था जो पूरी तरह से माता-पिता को कवर करेगा। आप उप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 में जोड़ा जा सकता है।

2

आप resizeEvent

द्वारा
def resizeEvent(self, newSize): 
    #do code here 
संबंधित मुद्दे