C++ QT Anfänger Frage ui setText

  • Hallo zusammen,
    ich habe einen QT C++ Anfänger Frage.
    UI steht in meiner Funktion settText nicht zu Verfügung.
    void settText(){ui->textBrowser->setText("test"); GEHT NICHT}

    In MainWindow::on_pushButton_clicked kann ich das
    void MainWindow::on_pushButton_clicked(){ui->textBrowser->setText("test");// GEHT}

    Wie kann ich in am einfachsten in der Funktion settText() auf die GUI zugreifen?

    Danke Berrie


    Einmal editiert, zuletzt von berrie (4. Januar 2016 um 16:50)

  • Die Grundlagen von C++ muss man schon beherrschen. In einer freien Funktion (und das ist setText) kann man nicht auf Instanzvariablen zugreifen. Woher sollen die kommen? Wer soll den setText aufrufen?

  • Hallo deets.
    ich bin kein Programmierer. Am liebsten nutze ich Visual Studio VB.net.
    Da kann ich aus einer Funktion auf die GUI zugreifen.
    Klassen, Vererbung und Instanzen sind für mich keine Grundlagen einer Programmiersprache.
    Grundlagen sind eher Scheifen, If Abfrage u.s.w.

    Das nur zum Thema Grundlagen. :)

    @Wer soll den setText aufrufen?
    Von überall möchte ich SetText aufrufen können.

    Ich möchte immer und überall Zugriff auf die GUI haben.
    Wie geht das?

    Ich möchte ein einfaches Programm schreiben.
    Ich möchte keine Klassen oder ähnliches nutzen.
    Wie es aber wohl aussieht werde ich dazu gezwungen.

    Was muss ich mir anschauen?

    Viele Grüße Berrie.

  • Grundlagen sind das, was du brauchst, um ein bestimmtes Problem zu loesen. Sich da jetzt mit semantischer Spitzfindigkeit rauszureden ist ja nett fuer den Debattierclub - aber es aendert nichts daran, dass du das, was du wissen musst, nicht kennst. Und generell GUI-Programmierung, aber ganz besonders Qt, sind hochgradig OO-basiert. Und VB ist es uebrigens auch.

    Eine freie Funktion wie setText kann per Definition nicht auf Zustand eines bestimmten Objektes zugreifen. Das ist beim Programmieren nicht anders als in der echten Welt - wenn ich dir eine A4-Seite mit Anweisungen gebe, auf der beschrieben ist, wie du ein Auto startest und wegfaehrst - dann erwartest du ja auch nicht, dass die darin beschriebenen Schritte in deinem Badezimmer funktionieren, oder?

    Du hast prinzipiell zwei Moeglichkeiten:

    - die haessliche: dein Mainwindow ist irgendwo mit einer globalen Variablen hinterlegt. Und in setText beziehst du dich auf die globale Variable.
    - die richtige: setText wird eine sogenannte Methode von MainWindow, und an der Stelle, wo de es aufrufen willst, hast du eine Referenz auf das MainWindow. Auch das kann wieder eine globale Variable sein - dann sind wir wieder bei dem haesslichen Punkt 1.

  • Hallo,
    ich habe mich die letzten Abende mit Klassen beschäftigt.
    Aber leider kann ich das noch nicht gut genug.
    Konkret geht es um ein mini UDP Chat Programm mit GUI Oberfläche.
    Die UDP Klasse habe ich aus einem Beispiel Tutorial nach programmiert.
    Ich verstehe zwar jetzt mehr aber noch nicht alles davon.

    Und so habe ich gedacht dass ich das Problem lösen kann.
    Ich glaube es ist _deets_ zweite unschöne Lösung.
    Ich habe in der class MainWindow einen public slots: void aktualisiereUiTextBrowser();
    Aufrufen wollte ich die mit: MainWindow::aktualisiereUiTextBrowser();
    Ich bin davon ausgegeangen das ich einen Public Slot immer aufrufen kann. Weil er ja public ist.
    Aber das geht leider nicht. Ich bekomme die Meldung: Unzulässiger Aufruf einer nicht statischen Memberfunktion.
    Ich kommen nicht weiter.

    Danke fürs lesen

    Grüße Berrie


    Hier ist der mein Code:

    mainwindow.h

    udpserver.h

    mainwindow.cpp

    Einmal editiert, zuletzt von berrie (16. Januar 2016 um 13:08)

  • Du hast immer noch nicht den fundamentalen Unterschied zwischen einer Funktion und einer Methode verstanden. Eine Funktion - und einen statische Methode *ist* eine Funktion - kennt kein Objekt, auf dem sie automatisch arbeitet. Eine Methode hingegen kennt dieses Objekt - aber nicht durch Magie, sondern dadurch, dass man sie *durch* das Objekt aufruft. Andere Beschreibungen reden von Nachricht verschicken an ein Objekt.

    Um das mal zu verdeutlichen (ich nehme Python, weil das simpler & klarer ist, und ohne Boilerplate auskommt, aber das Prinzip ist in C++ exakt gleich):

    Was soll denn nun deiner Meinung nach passieren? Woher soll denn wem_gehoerst_du wissen, auf welches konkrete Objekt sich der Aufruf bezieht? Kann es nicht. Es kommt in Python zu einer Fehlermeldung, und die ist analog zu dem, was du auch bekommst.

    Stattdessen musst du das *KONKRETE* Objekt benennen, fuer welches du den Aufruf taetigen moechtest, und weil das auesserst haeufig vorkommt, hat man sich dafuer - in C++ wie in Pyhon, und anderen Sprachen - eine abkuerzende Syntax einfallen lassen. In Python wie in C++ geht das so:

    Code
    print mein_auto.wem_gehoerst_du() # das geht, self ist implizit "mein_auto", und so geht das auch in C++
    print Auto.wem_gehoerst_du(dein_auto) # das geht auch, weil  es den self-Parameter halt explizit uebergibt - geht auch in C++, aber hat einen andere Syntax

    Solange du das nicht begriffen hast, wirst du mit meinen Anmerkungen oben auch nichts anfangen koennen. Ich empfehle dir wirklich dringend, mal einfach ein paar kleine Experimente zu machen, mit einem simplen 20-Zeilen-Programm, voellig ohne Qt und alles andere. Um mal wirklich zu lernen, wie OO funktioniert.

  • Hallo, ich habe mich jetzt mit Klassen, Vererbung und Zeigern befasst.
    Ich stehe noch am Anfang. Es funktioniert jetzt in einer Testdatei.

    Ich habe Testklasse erstellt.

    Code
    class testKlasse //: public MainWindow
    {
    public:
       void SetTextIntestKlasse(QString derSetText, MainWindow * pm);
    };


    Diese TestKlasse enthält die Methode

    Code
    void testKlasse::SetTextIntestKlasse(QString derSetText, MainWindow * pm)
    {pm->ui->textBrowser->setText(derSetText);}


    Ich gebe dieser Klasse einen Zeiger auf die UI mit.


    Ich hoffe das ist so richtig ausgedrückt.


    Leider Klappt das in meinem kleinen UDP Chat noch nicht.
    Wenn ich einer der Methoden ein MainWindow * pm mitgeben möchte bekomme ich Fehlermeldungen.
    Also zum Beispiel explicit MainWindow(QWidget *parent = 0,MainWindow * pm );
    Fehler: C2061: Syntaxfehler: Bezeichner 'MainWindow'


    Einmal editiert, zuletzt von berrie (25. Januar 2016 um 13:56)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!