QT-Designer direkter Methodenaufruf



  • Hallo,

    bin noch ziemlich neu also erschlagt mich nicht gleich*g

    Habe folgendes Problem:
    Ich habe eine gui mit QT-Designer erstellt funktioniert auch alles soweit. Ich
    habe die Bibliothek vor mir und lese fleißig die Methode usw.
    Alles noch im grünen Bereich.

    Ich nun mein Hauptfenster fertig und kann per click auf einem Button eine Methode aufrufen. Ist ja ganz easy die slots einzustellen im Desginer.

    Wenn ich aber nun z.B ein TextLabel habe und möchte, dass er einen Text bekommt würde ich ja schreiben:

    text_label->setText("blblblbla");
    

    Funktioniert nicht bekomme folgende Fehlermeldung:

    expected constructor, destructor, or type conversion before »->« token
    

    Wenn ich es aber vorher in einer Methode packe so:

    void Form1::test()
    {
    text_label->setText("blblblbla");
    }
    

    Irgend ein Button zuweise, dass er beim click diese Methode aufrufen soll per Designer, dann funktioniert es.

    Ich will aber nicht immer klicken bevor was passieren soll.
    Hoffe ihr habt es soweit verstanden und danke euch jetzt schon bin schon seit Tagen damit beschäftigt


  • Mod

    Ka was QT Designer angeht, aber den Aufruf musst du natürlich in eine Methode der Klasse unterbringen.



  • phlox81 schrieb:

    Ka was QT Designer angeht, aber den Aufruf musst du natürlich in eine Methode der Klasse unterbringen.

    Ja soweit hatte ich es auch verstanden. Aber ich kann die Methode nur per click aufrufen.

    Ich kann keine Methode aufrufen, bevor ich nicht explizit was geklickt habe (oder ein anders Event auslöse).
    Also das hier geht nicht:

    test();
    
    oder
    
    Form1::test();
    


  • Es gibt bestimmt so etwas wie ein Load- oder Initialize-Signal.



  • Nennt sich in C++ "Konstruktor" 😉

    Darin ist ja u.a. ein setupUi-Aufruf. Danach sollte die Gui stehen und es kann damit was gemacht werden.



  • Das "Problem" an QT ist der Haufen Code, von dem der Programmierer bzw der Neuling nix weiss, weil er automatisch generiert wird.
    Benutzt du den QTCreator?
    Da wird normalerweise die Variable ui definiert. Über diese kannst du auf text_label zugreifen.
    Also quasi:

    ui->text_label->setText("FOOBAR");
    

    iirc
    rya.



  • Ich benutze qt-designer. Und ihr habt recht, dass vieles automatisch generiert wird.

    Weiß jedoch auch, wie ich es ohne QT-Designer machen würde. Allerdings bin ich auch ziemlich neu in c++. Ich denke das sind einfache Anfangsschwierigkeiten.

    @Scorcher24

    Das ist doch mal ein Ansatz. Ich werde es gleich morgen fürh mal probieren. Ich halt euch auf dem laufenden und werde selbstverständlcih die Lösung später hier posten.

    Gruss



  • Joker1982 schrieb:

    Ich benutze qt-designer. Und ihr habt recht, dass vieles automatisch generiert wird.

    Weiß jedoch auch, wie ich es ohne QT-Designer machen würde. Allerdings bin ich auch ziemlich neu in c++. Ich denke das sind einfache Anfangsschwierigkeiten.

    @Scorcher24

    Das ist doch mal ein Ansatz. Ich werde es gleich morgen fürh mal probieren. Ich halt euch auf dem laufenden und werde selbstverständlcih die Lösung später hier posten.

    Gruss

    Lad dir mal die aktuelle Version runter (4.5) der hat den QTCreator dabei, da ist DEsigner, Compiler etc alles integriert und ist um einiges einfacher. Ausserdem wird da wie gesagt die ui-Variable definiert und es lässt sich einfach damit arbeiten, weil die IDE ein tooles intellisense hat.
    http://www.qtsoftware.com/downloads/sdk-windows-cpp
    rya.



  • Ist ja schon lange her.

    Habe es inzwischen auch mit qt Creator probiert aber dort ist das selbe spiel.

    ui->text_label->setText("FOOBAR");
    

    funktioniert nicht.

    Das kann doch nicht sein, dass man einen text_label nicht mit Text füllen kann ohne eine Methode aufrufen zu müssen. Und das schlimme ist hierbei, selbst ein
    Methoden auffruf kann nur stattfinden, wenn etwas geklickt wird oder ähnliches.

    Ich verzweifele hier noch.



  • QLabel *label = new QLabel(this);
    label->setText("LABEL TEXT");
    

    Funktioniert so immer.



  • JustSomeCoder schrieb:

    QLabel *label = new QLabel(this);
    label->setText("LABEL TEXT");
    

    Funktioniert so immer.

    Funktioniert nicht ! Folgende Fehlermeldung erhalte ich:

    Fehler: ungültige Verwendung von »this« auf höchster Ebene
    .ui/../gui.ui.h:104: Fehler: expected constructor, destructor, or type conversion before »->« token
    

    Ich nutze ja wieder den Qt Designer weil ich da einfach fast fertig bin.

    Nochmal zur Verständniss:

    Wenn ich ein Fenster mit qt-Designer erstelle legt er mir ja immer eine .h Datei an, wo ich halt drin Programmieren kann.

    void Form1::test()
    {
    // Packe ich hier mein "setText" ein funktioniert es
    // Aber auch nur wenn ich test mittels eines klicks auf ein Button oder
    // ähnliches aufrufe
    }
    

    Das wäre ja nicht so schlimm es darein zu schreiben aber ich bekomme es ja nicht mal hin die Methode test() aufzurufen ohne was zu klicken.



  • Joker1982 schrieb:

    Wenn ich ein Fenster mit qt-Designer erstelle legt er mir ja immer eine .h Datei an, wo ich halt drin Programmieren kann.

    Normalerweise "programmiert" man allerdings in den .cpp Dateien.
    Die Header-Dateien sollen ja hauptsächlich nur die ganzen Deklarationen von Klassen etc. enthalten.

    Der Konstruktor deiner GUI Klasse müsste doch in etwa so aussehen oder?

    MyWidget::MyWidget(QWidget *parent)
    	: QWidget(parent)
    {
    	ui.setupUi(this);
    }
    

    Deswegen versteh ich nicht wieso du nichtmal das this verwenden konntest.

    Und was passiert eigentlich wenn du setText() von deinem Label aufrufst?
    Gibt es einen Laufzeit fehler? Passiert einfach nichts? Oder lässt es sich nichtmal kompilieren?



  • @JustSomeCoder

    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        ui.setupUi(this);
    }
    

    Ja in etwa so sieht er aus. Dieser wird in einer cpp Datei geschrieben. Und für Programmieren legt mir qt-Designer eine .h datei an. Weil wenn ich was in cpp ändern würde macht er es eh wieder rückgängig.

    Und es lässt sich nicht kompilieren.



  • Also irgendetwas ist in deinem Projekt wohl ziemlich schief gegangen.

    Vielleicht kommst du weiter wenn du mal ein neues kleines Projekt nur zum testen erstellst, in welchem du dann auch nur ein einziges Label reinbaust.

    Und diesem Label kannst du ja dann versuchen einen Text zuzuweisen und dich da ein wenig herum spielen.

    Mit dem Qt Designer hab ich persönlich leider wenig Erfahrungen weil ich es in der Regel vermeide irgendwelche GUI Editoren/Designer zu verwenden, wo man nur etwas auf die schnelle zusammen klickt und dann ein ganzer Haufen Code automatisch erzeugt wird.

    Dein Problem ist vermutlich sogar ein gutes Beispiel dafür.
    Der Designer hat irgendwelchen Code automatisch erzeugt von welchem du garnichts weißt und deswegen klappt jetzt nichts mehr wie es soll.

    Aus diesem Grund setz ich nach wie vor darauf, alles selbständig und per Hand zu programmieren. 😃


Anmelden zum Antworten