[Qt Anfänger] ui in anderen (eigenen) Klassen/Methoden nutzen



  • Hallo,

    ich möchte gerne das aus QtCreator bekannte Standardobjekt "ui" auch in meinen eigenen Klassen und Methoden nutzen, welche eben nicht zu "MainWindow" gehören. Ich habe bislang erfolglos versucht, ui an meine Methoden zu übergeben. Wie bekomme ich das hin? Oder deutet dass darauf hin, dass das Programmdesign / -Stil dann komplett für die Tonne ist.
    Beispiel:

    class battle
    {
    public:
        unsigned int turn;
        void actions(QVector<character*>& characters, MainWindow ui);
    }
    
    void battle::actions(QVector<character*>& characters, MainWindow ui)
    {
        QString textbla = "blablabla";
        ui->listWidget->addItem(textbla);
    }
    
    void MainWindow::BattleBegin()
    {
        battles[0]->actions(characters, ui);
    }
    

    Wie muss die Übergabe aussehen, damit ich mit meinen ui-Inhalten agieren kann?



  • void actions(QVector<character*>& characters, MainWindow *ui);
    

    😕

    //noch nie ausprobiert/benutzt/keine garantie



  • Läuft leider nicht.
    bei

    actions(characters, *ui);
    

    Fehler:no matching function for call to 'battle::actions(QVector<character*>&, Ui::MainWindow&)'

    bei

    actions(characters, ui);
    

    Fehler:no matching function for call to 'battle::actions(QVector<character*>&, Ui::MainWindow*&)'

    void actions(QVector<character*>& characters, MainWindow *ui);
    

    ist es also leider nicht.



  • thuering schrieb:

    void actions(QVector<character*>& characters, MainWindow *ui);
    

    ist es also leider nicht.

    Doch, ist es. Aufruf mit:

    actions(characters, &ui); // Adressoperator nicht vergessen
    

    Oder du nimmst gleich eine Referenz:

    void actions(QVector<character*>& characters, MainWindow &ui);
    actions(characters, ui); // Aufruf wie gewohnt.
    


  • Nun habe ich

    Fehler:no matching function for call to 'battle::actions(QVector<character*>&, Ui::MainWindow*&)'
    

    Fehler beim Aufruf... bei der Variante mit der Referenz.

    Bei der anderen Methode:

    Fehler:no matching function for call to 'battle::actions(QVector<character*>&, Ui::MainWindow**)'
    


  • Dann funktioniert's so wie oben, du hast wohl nur den Namespace vergessen oder so.



  • Die Lösung:

    void actions(Ui::MainWindow *ui);
    

    Aufruf:

    actions(ui);
    

    Einzubinden ist

    #include "ui_mainwindow.h"
    

    Großer Dank an cooky451 dafür.

    Natürlich ist mir immer noch nicht ganz klar, ob das nicht vielleicht schlechten Programmierstil darstellt, aber das ist mir momentan egal, Hauptsache das Programm funktioniert :p



  • thuering schrieb:

    Natürlich ist mir immer noch nicht ganz klar, ob das nicht vielleicht schlechten Programmierstil darstellt, aber das ist mir momentan egal, Hauptsache das Programm funktioniert :p

    Du kannst das ja mal im Projekte Forum alles posten was du da treibst. Sind ja jetzt schon mehrere Beiträge von dir gekommen, ich glaube da gings um ein RPG-Spiel wenn ich mich nicht täusche?

    Eventuell kann dir ja der eine oder andere einen guten Ratschlag geben bezüglich des Designs deines Projekts

    Ist vielleicht auch besser wenn man sich vorher darum kümmert, nicht das du dann Monate/Jahre später an deinem Code was erweitern möchtest und du weißt nicht mehr was du da vor dir hast 🙂



  • Es ist nicht dolle, dein battle an das ui zu binden. Über das ui kann man das komplette MainWindow verändern und auch kaputt machen. Das andere Problem ist, dass du vielleicht mal dein ui veränderst, andere Namen vergibst, Klassen austauscht. Wenn dann ui-Zugriffe quer über alle möglichen Klassen in deinem Projekt verteilt sind, wird das unübersichtlich und sorgt für Fehler, die dann schwer zu debuggen sind (gilt allgemein und nicht nur für Qt mit GUI). Deshalb Funktionalität in Klassen bündeln, die auf solche Sachen spezialisiert sind. Für definierte Änderungen am MainWindow sollte MainWindow von sich aus eine öffentliche Schnittstelle anbieten. Da das aber in einer GUI schnell zu einem Gott-Objekt führen kann (managed alles, kann alles), denke darüber nach, gewisse Sachen auszulagern. Die Kommunikation stellst du dann via SIGNALS/SLOTS her.

    Hast du denn schon einen Post im Projekte-Unterforum aufgemacht? Hast nen Link, wos weitergeht? Denn wirklich mehr sagen kann man erst, wenn man mehr Hintergrnde/Designentscheidungen/... kennt.


Log in to reply