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
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!
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.
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...
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
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
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.
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...
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
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.
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))); |
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.