2016-03-23 11 views
0

mouseClickEvent ist in ViewBoxCustom.py und wird korrekt ausgelöst, wenn Sie auf die Szene klicken. ist in SPCanalyse.py und ViewBoxCustom.py importiert es nicht als würde das einen zyklischen Import machen. Ich weiß es can be done, aber ich möchte es vermeiden.Vermeiden Sie einen kreisförmigen Import, wenn ein Modul das Signal hat und ein anderer der Steckplatz und die Argumente müssen

Ausschnitt aus ViewBoxCustom

from SPCanalyse import MainWindow #This import should not exist 
def mouseClickEvent(self, ev): 
    elif ev.button() == QtCore.Qt.LeftButton: 
     ev.accept() 
     # The following line does not work because MainWindow is **NOT** imported 
     MainWindow.compute_spc_map(ev.pos().x(), ev.pos().y()) 

Ausschnitt aus SPCanalyse. SPCanalyse Importe ViewBoxCustom um Funktionen für den Zugriff auf und App-Funktionalität

from ViewBoxCustom import MultiRoiViewBox # MultiRoiViewBox contains mouseClickEvent 
def compute_spc_map(self, x, y): 
    if not self.preprocessed_frames == None: 
     self.image = fj.get_correlation_map(y, x, self.preprocessed_frames) 

Ich kann nur compute_spc_map in ViewBoxCustom platzieren erzeugen, weil preprocessed_frames eine Variable erzeugt und verwendet in SPCanalyse

ich dachte, es könnte funktionieren die mouseClickEvent in eine Verbindung mit compute_spc_map in SPCanalyse die folgenden in SPCanalyse

from ViewBoxCustom import MultiRoiViewBox 
self.vb = MultiRoiViewBox(lockAspect=True,enableMenu=True) 
self.vb.mouseClickEvent.connect(self.compute_spc_map) 
tun

leider mouseClickEvent hat kein Attribut ‚connect‘

+0

Ist 'ViewBoxCustom' ein Child-Widget des' MainWIndow'? Es ist ein wenig verwirrend, da der 'ViewBoxCustom'-Code 'compute_spc_map' aufruft, als wäre es eine Klassenmethode, aber im' SPCanalyse'-Code (wo 'MainWindow' definiert ist) wird es als eine normale Instanzmethode angezeigt. Ich nehme an, 'MainWindow' ist eine Klasse und keine globale Variableninstanz der echten MainWindow-Klasse. –

+0

Ja und MainWindow ist in der Tat eine Klasse – Frikster

Antwort

1

Es sieht aus wie Sie versuchen, eine Methode für einen Elternteil Widget von einem Kind-Widget zu nennen (dh. ViewBoxCustom ist ein Kind von MainWindow). Im Allgemeinen möchten Sie dies nicht tun, da dies die Flexibilität des untergeordneten Widgets einschränkt und zu zirkulären Abhängigkeiten führen kann, wie Sie es hier haben, wenn es keinen Grund gibt, warum das Kind vom Elternteil abhängig sein sollte.

Ein gutes Entwurfsmuster, das hier verwendet wird, ist, dass das Kind Signal ausgibt, mit dem der Elternteil eine Verbindung herstellt, und den Aufruf einer Funktion auslöst (im Gegensatz zum Kind-Widget, das die Funktion aufruft).

In Ihrem Fall:

class ViewBoxCustom(...) 
    clicked = QtCore.pyqtSignal(int, int) 

    def mouseClickEvent(self, ev): 
     if ev.button() == QtCore.Qt.LeftButton: 
      ev.accept() 
      self.clicked.emit(ev.pos().x(), ev.pos().y()) 


class MainWindow(QtGui.QMainWindow): 

    def __init__(...) 
     ... 
     self.vbc = ViewBoxCustom(...) 
     self.vbc.clicked.connect(self.on_vbc_clicked) 

    @QtCore.pyqtSlot(int, int) 
    def on_vbc_clicked(self, x, y): 
     self.compute_spec_map(x, y) 

Es gibt keinen Grund für ViewBoxCustom jemals zu importieren oder etwas über MainWindow wissen.

+0

Also ich habe es tatsächlich versucht. Ich bekomme AttributeError: 'ViewBoxCustom' Objekt hat kein Attribut 'angeklickt'. Aber Ihr "clicked = QtCore.pyqtSignal (int, int)" hat mich dazu gebracht, das Licht zu sehen, und jetzt funktioniert es nicht nur, ich verstehe jetzt besser, wie ich meine eigenen Signale einstelle (die Tutorials, die ich lese, wie man das oft macht ging über meinen Kopf) – Frikster