Forum: PC-Programmierung QT: mehrere SIGNALs auf ein SLOT?


von Mehmet K. (mkmk)


Lesenswert?

Servus allerseits

Bin seit geraumer Zeit dabei mich in QT einzuarbeiten.
Eine Frage, auf die ich keine Antwort fand:
In einer Form sind mehrere QLineEdits und ein QPushButton, der 
anfaenglich diesabled ist.
Nachdem ein Inhalt eines LineEdits veraendert wurde, soll der Button 
enabled werden.

Muss ich jetzt jedem einzelnen LineEdit ein editingFinished SLOT 
zuweisen? Oder gibt es irgend ein HokusPokus, mit dem ich alle LineEdits 
dieser Form dazu überreden kann, einen bestimmten SLOT zu benutzen?

Dank im voraus

von SkyperHH (Gast)


Lesenswert?

Du kannst ohne Probleme, mehrere Signale auf einen Slot legen...

Um den QButton einzuschalten gibt es die Function/Slot "void 
setEnabled(bool)" ... die erwartet aber einen Parameter vom Typ bool ... 
das Signal "editingFinished()" von QLineEdit hat diesen aber nicht.

Schreib Dir deshalb am besten eine "Function"/Slot, diese verbindest Du 
(ist auch "grafisch" im Editor möglich) Du mit dem "editingFinished()" 
Signalen... kannst dabei noch evtl. überprüfen, ob die eingegeben Werte 
passen - alternative kann das über den Validator schon im QLineEdit 
erfolgen... und dieser Slot sendet dann ein Signal mit dem Datentyp Bool 
aus, welches Du mit dem Button-Slot "setEnabled(bool)" verbundne ist!

von Mehmet K. (mkmk)


Lesenswert?

Danke für die prompte Antwort.
Z.Zt. habe ich zig on_Blabla_editingFinished slots in meinem Source. 
Sieht nicht gerade sehr professionel aus :)

Soweit ich Deinen Rat verstanden habe, muss ich auch hier jedes Objekt 
in die Hand nehmen. Und das wollte ich ja irgendwie vermeiden.

von SkyperHH (Gast)


Lesenswert?

Wieso zig on_Blabla_editingFinished Slots?? Du mußt doch das Signal vom 
QLineEdit verwenden...

Alternative könntest Du die Klasse QLineEdit ableiten und Dir eine 
eigene Klasse bauen, die ein passendes Signal liefert... oder du 
übergibst den Pointer des Pushbuttons deiner Klasse und läßt sie von 
dort aufrufen... oder, oder...

von Oliver (Gast)


Lesenswert?

QLineEdit emittert das SIGNAL editingFinished. Dafür brauchst du gar 
nichts weiter zu machen.

Das verbindest du per connect mit dem setEnabled-SLOT des Buttons. Und 
ja, das musst du für jede LineEdit-Instanz einzeln machen. Ein Problem 
sollte das aber nicht sein, oder?

Oliver

von Mehmet K. (mkmk)


Lesenswert?

SkyperHH, danke für den Hinweis.
Ich war so "clever", bei jedem LineEdit im QDesigner ein RechtsKlick zu 
machen und dort auf Go to Slot zu klicken.
Nach deinem Beitrag habe ich erkannt, dass ich ja im Constructor der 
Klasse auch
1
this->connect(ui->bla_1, SIGNAL(editingFinished()), this, SLOT(on_editingFinished()));
2
this->connect(ui->bla_2, SIGNAL(editingFinished()), this, SLOT(on_editingFinished()));
3
...
4
this->connect(ui->bla_n, SIGNAL(editingFinished()), this, SLOT(on_editingFinished()));
schreiben kann. Was natürlich die Sache um einiges übersichtlicher 
macht.
Aber irgendwie entnehme ich Deinem letzten Schreiben, dass das Ganze 
einen Kick eleganer ginge. Aber z.Zt. reicht mir dieser Lösungsweg.

Danke nochmal für Deine Hilfe

: Bearbeitet durch User
von Mehmet K. (mkmk)


Lesenswert?

Oliver, Deinen Rat habe ich so versucht umzusetzen:
1
this->connect(ui->bla_1, SIGNAL(editingFinished()), this, SLOT(ui->btnSave->setEnabled(true)));
Geht natürlich nicht. Ich nehme an, ich habe was falsch interpretiert.

von SkyperHH (Gast)


Lesenswert?

So hatte ich mir das grob vorgestellt... ich bin mir aber nicht sicher, 
ob das mit dem true als Wert funktioniert...

Bleibt noch die Frage, wo deine Zeile steht, wo das Signal mit dem Slot 
verbunden wird...

von Mehmet K. (mkmk)


Lesenswert?

SkyperHH schrieb:
> Bleibt noch die Frage, wo deine Zeile steht, wo das Signal mit dem Slot
> verbunden wird...

In einer Class-Methode, die als letztes vom Constructor aufgerufen wird. 
Also nach
1
ui->setupUi(this);

Aber wie schon gesagt: mit dem jetzigen Lösungsansatz bin ich schon sehr 
zufrieden.
Ich übersetze zu Uebungszwecken ein mehr als 14 jaehriges Vfp* Program 
(das immer noch im Einsatz ist). Mein erstes Ziel ist es schnell 
vorwaerts zu kommen, um mein Motivationslevel hoch zu halten. Deshalb 
gehe ich nicht allzusehr ins Detail.
Nochmals danke!


* Visual FoxPro

von Rolf Magnus (Gast)


Lesenswert?

SkyperHH schrieb:
> So hatte ich mir das grob vorgestellt... ich bin mir aber nicht sicher,
> ob das mit dem true als Wert funktioniert...

Tut es nicht. Eine Verbindung zwischen einem Signal und einem Slot kann 
nicht irgendwelche Werte enthalten.
Und ja, ich finde es auch ziemlich idiotisch, daß es zwar sowohl 
setEnabled(), als auch setDisabled() gibt, aber beide zwingend einen 
bool als Argument haben wollen. Das macht sie als Slots für einen 
Großteil der Anwendungsfälle unbrauchbar.

von Rolf Magnus (Gast)


Lesenswert?

Man kann sich ja einen kleinen Adapter schreiben:
1
class MySignalAdapter : public QObject
2
{
3
     Q_OBJECT
4
public:
5
    MySignalAdapter(QObject* sender, const char* signame, QObject* receiver, const char* slotname)
6
        : QObject(sender)
7
    {
8
        connect(sender, signame, this, SLOT(slot()));
9
        connect(this, SIGNAL(signal(bool)), receiver, slotname);
10
    }
11
12
public slots:
13
    void slot() { emit signal(true); }
14
15
signals:
16
    void signal(bool);
17
};
Anzuwenden dann etwa so:
1
new MySignalAdapter(lineEdit, SIGNAL(editingFinished()), button, SLOT(setEnabled(bool)));

von Oliver (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Tut es nicht. Eine Verbindung zwischen einem Signal und einem Slot kann
> nicht irgendwelche Werte enthalten.

Selbstverständlich kann die das. Nur müssen die Parameterlisten halt 
übereinstimmmen.

> Und ja, ich finde es auch ziemlich idiotisch, daß es zwar sowohl
> setEnabled(), als auch setDisabled() gibt, aber beide zwingend einen
> bool als Argument haben wollen.

Laut Doku hat der bool-Parameter von setEnabled den default-Wert true, 
und kann damit auch weggelassen werden. Und schon klappts auch mit 
Signalen ohne Parameter.

Oliver

von Rolf Magnus (Gast)


Lesenswert?

Oliver schrieb:
> Rolf Magnus schrieb:
>> Tut es nicht. Eine Verbindung zwischen einem Signal und einem Slot kann
>> nicht irgendwelche Werte enthalten.
>
> Selbstverständlich kann die das.

Nein.

> Nur müssen die Parameterlisten halt übereinstimmmen.

Diese Aussage ergibt in dem Zusammenhang keinen Sinn. Kann es sein, daß 
du meinen Posting falsch verstanden hast? Natürlich können Slots 
Parameter haben. Aber ich kann nicht bereits im Connect einem Parameter 
einen festen Wert geben.

> Laut Doku hat der bool-Parameter von setEnabled den default-Wert true,
> und kann damit auch weggelassen werden. Und schon klappts auch mit
> Signalen ohne Parameter.

Laut welcher Doku? In dieser hier steht nichts von einem 
Default-Paramter:
hhttp://qt-project.org/doc/qt-5/qwidget.html#public-slots

von Oliver S. (oliverso)


Lesenswert?

Rolf Magnus schrieb:
> Kann es sein, daß
> du meinen Posting falsch verstanden hast? Natürlich können Slots
> Parameter haben. Aber ich kann nicht bereits im Connect einem Parameter
> einen festen Wert geben.

Das stimmt natürlich.


> Laut welcher Doku? In dieser hier steht nichts von einem
> Default-Paramter:
> hhttp://qt-project.org/doc/qt-5/qwidget.html#public-slots

Hm. Ich lese da wörtlich:

> By default, this property is true.

http://qt-project.org/doc/qt-5/qwidget.html#enabled-prop

Olivr

von Rolf Magnus (Gast)


Lesenswert?

Oliver S. schrieb:
> Hm. Ich lese da wörtlich:
>
>> By default, this property is true.

Ja, die Property "enabled" ist per Default true, sprich: Widgets sind 
bei ihrer Erzeugung immer erstmal enabled. Das hat nichts mit einem 
Default-Parameter beim Slot setEnabled() zu tun.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.