[gelöst] QCombobox beim verlassen auslesen

Alles rund um die Programmierung mit Qt
Antworten
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

[gelöst] QCombobox beim verlassen auslesen

Beitrag von methusalem »

Moin,

ich möchte geren den Inhalt einer QCombobox auslesen, wenn ich per Tab, Return oder Mausklick diese verlasse.

Wie würdet Ihr das machen? Es gibt ja wohl kein Signal für den Verlust des Focus, oder? Würdet Ihr das über QWidget::focusOutEvent machen?
Martin
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QCombobox beim verlassen auslesen

Beitrag von macman »

methusalem hat geschrieben:Würdet Ihr das über QWidget::focusOutEvent machen?
Genau, QComboBox überschreiben und im focusOutEvent ein Signal an die Eltern schicken.
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

Re: QCombobox beim verlassen auslesen

Beitrag von methusalem »

macman hat geschrieben: Genau, QComboBox überschreiben und im focusOutEvent ein Signal an die Eltern schicken.
Hmm, das wäre ja total blöd. Da ich dann alle ComboBoxen von dieser abgeleiteten Klasse erstellen müsste. Und damit wäre das schnelle zusammenklicken des Layouts mit dem Designer ja dann auch hinfällig, da dieser die Combobox ja von QCombobox ableitet.

Warum haben die Trolle das Signal lostFocus() hier nicht eingebaut?
Martin
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QCombobox beim verlassen auslesen

Beitrag von macman »

methusalem hat geschrieben:Hmm, das wäre ja total blöd.
Aber nicht unmöglich. Da ich selten eine *.ui Datei anfasse, wenn sie denn erstmal fertig ist, habe ich es auch schon so gelöst, das ich die ui_blabla.h editiert habe. Muß man dann aber nach jedem Kompletterstellen neu machen oder man überlässt es einem Skript.
methusalem hat geschrieben:Warum haben die Trolle das Signal lostFocus() hier nicht eingebaut?
Sie haben es nirgends eingebaut und zu 3er Zeiten gab es das auch nur bei QLineEdit.
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

Re: QCombobox beim verlassen auslesen

Beitrag von methusalem »

Moin,
macman hat geschrieben:
methusalem hat geschrieben:Warum haben die Trolle das Signal lostFocus() hier nicht eingebaut?
Sie haben es nirgends eingebaut und zu 3er Zeiten gab es das auch nur bei QLineEdit.
Naja, es wäre halt praktisch, wenn dieses Signal vorhanden wäre!

Aber vielleicht bin ich ja auch auf dem Holzweg, und man kann mein Problem ganz anders lösen.

Ich habe mehrere Comboboxen, in denen jeweils ein Name ausgewählt werden soll. Wenn der User nun in einer dieser Boxen einen Namen ausgewählt, oder über die Tastatur eingegeben hat soll das Programm diese Namen in einem Array speichern.
Ich wollte nun immer dann, wenn der User eine Combobox verlässt den Wert der Combobox auslesen. Und dazu wäre halt ein Signal lostFocus() sehr nett.

Hat jemand ne andere Idee?
Martin
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Warum haben die Trolle das Signal lostFocus() hier nicht eingebaut?
Sie haben es nirgends eingebaut und zu 3er Zeiten gab es das auch nur bei QLineEdit.
schreck lass nach...

es gibt in der 4.0 tatsächlich kein lostFocus signal mehr für QLineEdit. Zum Glück wurde es wenigstens durch das (ähnliche) editingFinished() Signal abgelöst, so dass man z.B. im Anschluss an eine Eingabe noch Nachberechnungen anstellen kann.

Gruss Arne
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Re: QCombobox beim verlassen auslesen

Beitrag von ArneStocker »

methusalem hat geschrieben: Ich habe mehrere Comboboxen, in denen jeweils ein Name ausgewählt werden soll. Wenn der User nun in einer dieser Boxen einen Namen ausgewählt, oder über die Tastatur eingegeben hat soll das Programm diese Namen in einem Array speichern.
Ich wollte nun immer dann, wenn der User eine Combobox verlässt den Wert der Combobox auslesen. Und dazu wäre halt ein Signal lostFocus() sehr nett.

Hat jemand ne andere Idee?
also ... auf Änderungen des ComboBox Eintrages kannst Du über das Signal activated(int) reagieren. Ist die ComboBox editierbar, wird zusätzlich ein QLineEdit mit der ComboBox erzeugt (pComboBox->lineEdit() ist dann ungleich NULL). Das Signal dieses LineEdit - Objektes (ob nun lostFocus oder editingFinished) kannst Du mit Deinem Slot verbinden

Gruss Arne

PS: eine andere einfache Möglichkeit wäre ein eventfilter auf die ComboBox zu setzen und das focusOutEvent abzufangen
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

Re: QCombobox beim verlassen auslesen

Beitrag von methusalem »

ArneStocker hat geschrieben: ...
Ist die ComboBox editierbar, wird zusätzlich ein QLineEdit mit der ComboBox erzeugt (pComboBox->lineEdit() ist dann ungleich NULL). Das Signal dieses LineEdit - Objektes (ob nun lostFocus oder editingFinished) kannst Du mit Deinem Slot verbinden
Ahh, das war mir nicht klar, das es da dann noch ein LineEdit Object gibt. Das wäre ja schon ganz gut.
PS: eine andere einfache Möglichkeit wäre ein eventfilter auf die ComboBox zu setzen und das focusOutEvent abzufangen
Hmm, ich gebe zu, das mir das Stichwort Eventfilter nicht so viel sagt. Wo finde ich dazu etwas in der QT-Doku?

Ansonsten vielen Dank für den Tip!
Martin
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Code: Alles auswählen

DialogKlasse::DialogKlasse(..)
{
    ...
    this->installEventFilter( pFilterObj ); // pFilterObj = ComboBox
}

bool DialogKlasse::eventFilter(QObject *pFilterObj,QEvent *pEvent)
{
    if (   (pFilterObj == ... ComboBox) &&
           (pEvent->type() == FocusOut)  )
    {
         .... todo
    }
    return BasisKlasse::eventFilter(..);
}
Gruss Arne
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

Beitrag von methusalem »

Nabend,

vielen Dank für dein Codebeispiel! Ich werd mich da die nächsten Tage mal mit beschäftigen!
Martin
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

Beitrag von methusalem »

ArneStocker hat geschrieben:

Code: Alles auswählen

DialogKlasse::DialogKlasse(..)
{
    ...
    this->installEventFilter( pFilterObj ); // pFilterObj = ComboBox
}

...

Muss dich hier korrigieren. es muss heißen:

Code: Alles auswählen

{
    ...
    pFilterObj->installEventFilter(this); // pFilterObj = ComboBox
}
Funktioniert einwandfrei. Vielen Dank nochmal.
Martin
Antworten