mousePressEvent eines QLabels

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Riebers
User
Beiträge: 8
Registriert: Sonntag 18. Juni 2017, 18:52

mousePressEvent eines QLabels

Beitragvon Riebers » Mittwoch 12. Juli 2017, 15:05

Hallo Elite,

ich möchte gerne mittels Qlabel eine Liste erstellen. Dabei wird zuerst ein Fenster geöffnet und mit dem Drücken eines Qlabel ein neues Fenster. Das zweite Fenster soll mit Hilfe eines mousePressEvent geöffnet werden. Bei dem neuen Fenster sollen dann aus vier Farben, dargestellt mit farbigen Qlabels, gewählt werden. Mein Problem ist, dass das mousePressEvent gar nicht berücksichtigt wird. Es wird sofort die List ausgegeben. Kann mir jemand weiterhelfen warum das so ist?!

CODE Hauptfenster:
  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QMainWindow
  3. from PyQt5 import uic
  4. import Test2
  5.  
  6. class Window1(QMainWindow):
  7.     def __init__(self):
  8.         super().__init__()
  9.         self.ui = uic.loadUi("Window1.ui",self)
  10.        
  11.        
  12.         self.window2 = Test2.Window2()
  13.        
  14.         self.lbl0.mousePressEvent = self.kombination()                      # Bei drücken des Labels (lbl0) soll sich das zweite Fenster öffnen
  15.        
  16.         self.show()
  17.     def kombination(self):
  18.         self.window2.show()
  19.         self.kombination = list()
  20.         self.window2.lbl_r.mousePressEvent = self.kombination.append("red") # Bei drücken des Labels im zweiten Fenster (lbl_r) soll "red" der list
  21.         print("Kombination: {}".format(self.kombination))                   # hinzugefügt werden
  22.        
  23. if __name__ == '__main__':
  24.     app = QApplication(sys.argv)
  25.     example = Window1()
  26.     sys.exit(app.exec())


CODE zweites Fenster:
  1. from PyQt5 import uic
  2.  
  3. from PyQt5.QtWidgets import QWidget
  4.  
  5. class Window2(QWidget):
  6.     def __init__(self):
  7.         super().__init__()
  8.         self.ui = uic.loadUi("Window2.ui",self)
  9.    


Die Gui's habe ich mit dem Qt designer erstellt...
Es wird direkt "Kombination: ['red']" ausgegeben. Falls ich etwas vergessen habe bzw. etwas undeutlich ist bitte bescheid geben^^.

Grüße
Riebers
Zuletzt geändert von Anonymous am Mittwoch 12. Juli 2017, 18:06, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
__deets__
User
Beiträge: 1323
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: mounsePressEvent eines QLabels

Beitragvon __deets__ » Mittwoch 12. Juli 2017, 15:18

Da ist manches quer.

self.kombination ist eine Methode. Wenn du die als Ereignisbehandlung benutzen willst, darfst du sie *NICHT* aufrufen. Sondern musst sie als Wert uebergeben. Kleines Beispiel (ohne Qt) zur Illustration:

  1. class Foo(object):
  2.  
  3.     def kombination(self):
  4.           print("kombination")
  5.  
  6. class Bar(object):
  7.  
  8.       def __init__(self, event):
  9.             self._even = event
  10.  
  11.        def trigger(self):
  12.               self._event() # JETZT wird's aufgerufen
  13.  
  14. foo = Foo()
  15. bar = Bar(foo.kombination) # NICHT aufrufen, sondern die gebundene Methode uebergeben
  16. bar.trigger()


Dann ueberschreibst du self.kombination mit einer Liste, was man so nicht tun sollte, sondern einen neuen Namen dafuer benutzen. Und zu guter letzt rufst du auch da schon wieder etwas direkt auf, statt es als aufrufbares Objekt (callable in Python-Lingo) an mousePressEvent zu uebergeben.

Eine Moeglichkeit das zu tun ist ein lamba zu benutzen:

Code: Alles auswählen

self.window2.lbl_r.mousePressEvent = lambda: self.kombination.append("red")   # dadurch wird's ein callable, und nicht sofort aufgerufen.
Riebers
User
Beiträge: 8
Registriert: Sonntag 18. Juni 2017, 18:52

Re: mousePressEvent eines QLabels

Beitragvon Riebers » Mittwoch 19. Juli 2017, 10:34

Danke deets für die Verbesserungen, jedoch verstehe ich nicht ganz wie ich das umsetzen soll. Ich habe mein code wie folgt verändert, bekomme aber immer einen "RecursionError: maximum recursion depth exceeded while calling a Python object".
  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
  3. from PyQt5 import uic
  4.  
  5.      
  6. class Window1(QMainWindow):
  7.     def __init__(self):
  8.         super().__init__()
  9.         self.ui = uic.loadUi("Master1.ui",self)
  10.        
  11.         self.win1 = Window1()
  12.         self.win2 = Window2(self.win1.kombination)
  13.            
  14.         self.lbl11.mousePressEvent = self.win2()              # Bei drücken des Labels soll sich das zweite Fenster öffnen
  15.            
  16.         self.show()
  17.     def kombination(self):
  18.        
  19.         print("Juhu es klappt!")                  
  20.            
  21.        
  22.  
  23. class Window2(QWidget):
  24.     def __init__(self):
  25.         super().__init__()
  26.         self.ui = uic.loadUi("Master2.ui",self)
  27.        
  28.        
  29. if __name__ == '__main__':
  30.     app = QApplication(sys.argv)
  31.     example = Window1()
  32.     sys.exit(app.exec())


Kannst du mir da weiterhelfen?
Zuletzt geändert von Anonymous am Mittwoch 19. Juli 2017, 11:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
__deets__
User
Beiträge: 1323
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: mousePressEvent eines QLabels

Beitragvon __deets__ » Mittwoch 19. Juli 2017, 10:50

Du hast ja nun nix von dem was ich geschrieben habe in irgendeiner Art umgesetzt. Das mousePressEvent ist *schon wieder* kein Callback. Zum einen, weil du mein Beispiel offensichtlich nicht wirklich angeschaut hast, zum zweiten, weil du versuchst, ein Window aufzurufen, was dann auffallen wuerde, wenn du die Klammern (wie ich ja schon schrieb) weglaesst, oder ein lambda: davor packst.

Und da ich deine ganzen UI-Dateien nicht habe, kann ich ja nun auch nicht wirklich etwas aus dem Code machen.

Ich schlage vor, du versuchst einfach mal, ein simples Minimalbeispiel on UI-Files zu bauen, um dich mit der Mechanik der Callbacks vertraut zu machen. Das hat dann auch eine Chance hier verbessert zu werden.

Ich bin auch immer noch nicht davon ueberzeugt, dass dein mousePressEvent Ansatz richtig ist. Normalerweise verbindet man sich mit clicked-Signalen. Aber da mag ich falsch liegen.
BlackJack

Re: mousePressEvent eines QLabels

Beitragvon BlackJack » Mittwoch 19. Juli 2017, 11:13

@Riebers: Vollzieh doch einfach mal nach was da passiert. Schritt für Schritt. Notiere Dir die Aufrufe auf einem Blatt Papier die da nach und nach passieren, dann solltest Du sehr schnell sehen wo diese Endlosrekursion liegt.

Zur Frage des `mousePressEvents`: Warum verwendest Du denn ein Label um eine Aktion auszulösen? Das erwartet man als Benutzer ja nicht wirklich, sondern eine Schaltfläche oder einen Link den man anklicken kann. Letzteren kann man auf einem `QLabel` anzeigen lassen, dann würde man das `linkActivated`-Signal verbinden.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder