Qt 5.13: Aktualisieren von Buttons/MenuItems



  • Hallo zusammen,

    ich mache gerade meine ersten Schritte mit Qt und hab eine Frage:
    Man kann Menüpunkten/Buttons eine QAction zuweisen und im triggered Event Handler auf die Benutzeraktion reagieren. Jetzt möchte ich, dass die QAction deaktiviert wird, wenn bestimmte Bedingungen nicht erfüllt sind, zb. ein Textfeld ist leer, andere Eingabeelemente haben ungültige Werte, etc.
    Im Embarcadero VCL-Framework gibt es eine TAction Komponente, die ein OnUpdate Event anbietet, das wohl timergesteuert angesprungen wird. In der VCL löst man das dann so:

    void MyForm::OnUpdateActionOk( TObject* Sender )
    {
       ActionOk->Enabled = !SomeTextEdit->Text.IsEmpty();
    }
    

    Geht sowas unter Qt auch? Oder muss ich für alle Eingabeelemente einen Handler bereitstellen, der bei Änderung gegebenenfalls den Status der QAction anpasst, also etwa sowas:

    void MyForm::on_text_edit_1_changed()
    {
        adjust_action_state();
    }
    
    void MyForm::on_text_edit_2_changed()
    {
       adjust_action_state();
    }
    
    void MyForm::adjust_action_state()
    {
       ActionOk->set_enabled( !SomeTextEdit1->Text.IsEmpty() && !SomeTextEdit2->Text.IsEmpty() );
    }
    


  • Du könntest deine adjust Funktion mit einem QTimer ausführen.



  • So habe ich das jetzt auch gemacht. Ich probiere jetzt zwei Tagen mit Qt rum und das ist irgendwie.... sperrig 😕



  • @DocShoe ist sicher auch Gewöhnungssache. Du kannst natürlich auch aus adjust_action_state einen Slot machen und die Signals damit verknüpfen. Das geht über die GUI im Creator (ist dann aber nur im generierten Code zu sehen) oder auch einfach per händischem connect im Konstruktor der Form.



  • Ich mache es genau so wie @DocShoe es selber geschrieben hat. Nur das "adjust_action_state()" bei mir ein SLOT ist, den man dann auch mit anderen Signalen verbinden kann. Nur wenn eben der SLOT nicht zum SIGNAL passt ( von der Signatur her ) gehe ich den Umweg über einen extra SLOT, der dann adjust_action_state() klassisch als Funktion aufruft.


Anmelden zum Antworten