2012-01-21 15 views
18

Bir widget yeniden boyutlandırıldığında bir eylem yapmak istiyorum.QWidget yeniden boyutlandırma sinyali mi?

Bu pencere öğesi üzerinde bir olay filtresi yüklemeden (ve açıkçası, alt sınıflara ayırmadan) yakalamanın bir yolu var mı? AFAIK, QWidget’in resized sinyali yoktur.

+4

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 :) –

cevap

11

reimplement edebilirsiniz. Bunu sublclassing olmadan PyQt4 ile Python kullandığınız durumda Qt docs

17

Sen widget sınıftan türetmek ve size QObject::installEventFilter(QObject * filter) ve aşırı yük bool eventFilter(QObject *, QEvent *) kullanabilir QWidget buna sıkı bir ilişki kurabilen başka QObject varsa resizeEvent olay

+0

warwaruk'un "alt sınıf olmadan" ve " –

+0

@KamilKlimek" yazdığını not edin. – Lol4t0

+0

cevabını yayınladıktan sonra, –

9

daha, kendi işlevine widget.resizeEvent ayarlayabilirsiniz Bkz:

#!/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

Bu, resizeEvent'in temel sınıf uygulamasının çalışmasını engeller. Önemli bir şey yapıyor olabilir. Ve maymun yama çözümü ile, orijinal yönteme ayrı bir değişken olarak bir referans tutmak zorunda kalacaksınız. Dağınık. – Chris

+2

@Chris Dokümanlar, resizeEvent'in çağrıldığı andaki widget'ın zaten yeni geometrisine sahip olduğunu söylüyor, böylece ana widget üzerinde başka bir işleminiz yoksa işlevi geçersiz kılabilirsiniz. QScrollArea içeriğini yeniden boyutlandırmak için bu tekniği kullanıyorum. – blameless75

2

Maalesef, bu kesmek gibi görünüyor, ama bu kullanın:

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

Python'un okunaklılığı için tasarlanması çok fazla. Ancak, süper uygulamayı korumak için +1. –

2

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.

2

Sen resizeEvent

tarafından
def resizeEvent(self, newSize): 
    #do code here