PyQt5: QListEdit mit clicked Signal austaten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cR0N0s
User
Beiträge: 19
Registriert: Sonntag 15. März 2020, 15:45

Moin Moin,

ich bin aktuell am verzweifeln, das QLineEdit kein Signal enthält, welches dem clicked() bei QPushButton gleicht.
Die Idee dahinter ist, wenn ich in das ListEdit rein klicke bzw. was auswähle, dann soll eine Funktion aufgerufen werden.
Ja ich weiß, das klingt komisch im erstem Augenblick, aber mit diesem Signal soll ein ListWidget befühlt werden, welches für das ausgewählte QLineEdit zur Auswahl stehende Begriffe anzeigt. Da es mehrere QLineEdit Widgets gibt, will ich nicht zu jedem QLineEdit auch ein QListWidget erzeugen, sondern das ganze nur über eins lösen und das Programm übersichtlich halten
Leider entsprechen alle 7 in QLineEdit enthaltenen Signale nicht wirklich dem gewünschtem clicked.

Vielleicht kann mir jemand bei meinem Problem helfen.

Code: Alles auswählen

from PyQt5.QtWidgets import QLineEdit
import PyQt5.QtWidgets as widgets
import PyQt5.QtGui as Gui
import PyQt5.uic as uic
import sys
from PyQt5.QtCore import Qt



class MylineEdit(QLineEdit):
    def le_clicked():
        #...


app = widgets.QApplication(sys.argv)
test_ui = uic.loadUi("test.ui")


def test_f():
    print("test")


test_ui.lineEdit = MylineEdit()
test_ui.lineEdit.le_clicked(test_f)





test_ui.show()
sys.exit(app.exec_())
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Suchst Du das Focus-Signal?
cR0N0s
User
Beiträge: 19
Registriert: Sonntag 15. März 2020, 15:45

Wenn ich es grob überschlage, behaupte ich erst mal.
Da ich mit der Auswahl eines bestimmten QLineEdit mich in dem Moment auch auf dieses fokussiere.
cR0N0s
User
Beiträge: 19
Registriert: Sonntag 15. März 2020, 15:45

Sirius3 hat geschrieben: Montag 8. März 2021, 13:31 Suchst Du das Focus-Signal?
Danke für den Hinweis, dass es noch mehr Möglichkeiten gibt um zu meinem Ziel zu kommen.
Hab mir in PyQt5 das QFocusEvent angeschaut und in den weiten des Internet nach Anwendungsbeispiele geschaut, werde leider noch nicht ganz schlau aus diesen.
Am liebsten würde ich verstehen, anwenden und mein Problem selber lösen, aber noch brauche ich bei dem FocusEvent Hilfe.

Wie würde es aussehen, wenn man mit mindestens 2 LineEdit arbeiten würde und abhängig vom Focus die entsprechende Funktion ausgeführt wird?

Vielen dank, falls mir da jemand helfen kann. :)
Benutzeravatar
__blackjack__
User
Beiträge: 13920
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cR0N0s: Am flexibelsten würde man sich eine Klasse von `QObject` ableiten, dort die `event()`-Methode implementieren und das Exemplar dann mit `installEventFilter()` auf dem Widget installieren dessen Ereignisse man abfangen/behandeln möchte. Bei der Install-Methode gibt es ein Beispiel in der Qt-Dokumentation.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
cR0N0s
User
Beiträge: 19
Registriert: Sonntag 15. März 2020, 15:45

__blackjack__ hat geschrieben: Montag 8. März 2021, 20:33 @cR0N0s: Am flexibelsten würde man sich eine Klasse von `QObject` ableiten, dort die `event()`-Methode implementieren und das Exemplar dann mit `installEventFilter()` auf dem Widget installieren dessen Ereignisse man abfangen/behandeln möchte. Bei der Install-Methode gibt es ein Beispiel in der Qt-Dokumentation.
Vielen dank für diesen Tip.
Ich hab mich umgeschaut und versucht, das soweit nach zubauen.
Bestimmt ist mein Aktueller Stand totale Grütze und es ist irgendwie etwas Peinlich es zu zeigen, aber irgendwie muss ich aus den Fehlern lernen.
Es wird aktuell kein Fehler gemeldet, das Gui wird aufgeführt und ich kann darin zwischen den LineEdit hin und her wechseln, aber ohne eine Reaktion.

Code: Alles auswählen

from PyQt5.QtWidgets import QLineEdit
import PyQt5.QtWidgets as widgets
import PyQt5.QtGui as Gui
import PyQt5.uic as uic
import sys
from PyQt5.QtCore import Qt, QObject



app = widgets.QApplication(sys.argv)
test_ui = uic.loadUi("test.ui")


class MyLineEdit(QObject):
    def event(self, obj, event):
        if event == lineEdit:
            test_f()
        elif event == lineEdit_2:
            test_f_2()


def test_f():
    print("test")
def test_f_2():
    print("test 2")

le_select = MyLineEdit()
test_ui.lineEdit.installEventFilter(le_select)
test_ui.lineEdit_2.installEventFilter(le_select)



test_ui.show()
sys.exit(app.exec_())
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du neigst dazu dir einfach Dinge auszudenken. So wie die Signatur hier von event. Die gibt es so nicht. Du musst da schon der Dokumentation folgen: https://doc.qt.io/qt-5/qobject.html#eventFilter

Und wieso sollte das event(!) Objekt das du bekommst (das für jedes Event, also jeden Tastendruck, jede Mausbewegung, etc, neu ist) gleich irgendeinem GUI-Objekt sein? Der Vergleich muss auf das GUI-Objekt lauten.
cR0N0s
User
Beiträge: 19
Registriert: Sonntag 15. März 2020, 15:45

__deets__ hat geschrieben: Dienstag 9. März 2021, 20:25 Du neigst dazu dir einfach Dinge auszudenken. So wie die Signatur hier von event. Die gibt es so nicht. Du musst da schon der Dokumentation folgen: https://doc.qt.io/qt-5/qobject.html#eventFilter

Und wieso sollte das event(!) Objekt das du bekommst (das für jedes Event, also jeden Tastendruck, jede Mausbewegung, etc, neu ist) gleich irgendeinem GUI-Objekt sein? Der Vergleich muss auf das GUI-Objekt lauten.
Danke für den Link, aber wie soll mir die Dokumentation für C++ in Python weiter helfen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil die Dokumentation für Qt immer nur in C++ verfügbar ist. Es gibt keine (vollständige) für Python. Und das macht auch nichts, weil man die meistens mehr oder minder 1:1 übertragen kann.

Vor allem aber: was ist denn die Alternative? Raten?
Benutzeravatar
__blackjack__
User
Beiträge: 13920
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cR0N0s: Die Qt-API in Python ist aus der C++-API generiert, das heisst die ist im Grunde gleich. Es gibt an einigen Stellen Unterschiede bei C++ und Python. Und *das* ist das was im wesentlichen in der PyQt-Dokumentation steht, wie diese Unterschiede auf die Python-Anbindung abgebildet sind. Es würde auch nicht so viel Sinn machen das alles noch mal für Python zu dokumentieren weil vieles einfach nur eine Kopie der Qt-Dokumentation wäre und das was anders ist, beispielsweise Codebeispiele lässt sich zwar nicht automagisch nach Python übersetzen, aber man muss nicht allzuviel C++-Syntax lesen können um die Beispiele auf die Python-Anbindung zu portieren.

Das ist bei Gtk und Tk letztendlich nicht anders. Da landet man früher oder später bei Detailfragen auch bei der Dokumentation der C-API bei Gtk oder Tcl bei Tk.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten