QT - Einsteigerprogramm - Einfache Ein- und Ausgabe



  • Wie steht es um dein Programm?
    Hast du alles so hinbekommen, wie du es wolltest?



  • Nein habs noch nicht. Ich hab ein recht ähnliches Beispiel aus Wikibooks, da kommt ein this-Zeiger drin vor, da muß ich meine C++ Kenntnisse erst ein bißchen auffrischen. Aber ist nett, daß Du fragst.



  • abacus schrieb:

    Nein habs noch nicht. Ich hab ein recht ähnliches Beispiel aus Wikibooks, da kommt ein this-Zeiger drin vor, da muß ich meine C++ Kenntnisse erst ein bißchen auffrischen. Aber ist nett, daß Du fragst.

    this zeigt immer auf die momentane Instanz der Klasse.
    rya.



  • Hallo, ich bin jetzt ne Weile nicht dazugekommen, aber so gehts jetzt erst mal.

    #include "Uebergabe.h"
    #include <QObject>
    
    Uebergabe::Uebergabe(QMainWindow *parent) : QMainWindow(parent){
        setupUi(this);
        InputA -> setText("hier");
        // OutputA -> setText("hier erscheint die Ausgabe");
    
        connect(Ausfuehren, SIGNAL (clicked()), this, SLOT (showText()));
    
    }
    
    Uebergabe::~Uebergabe(){}
    
    void Uebergabe::showText() {
        QString a;
    
        a = InputA -> text();
    
        OutputA -> setText(a);
    
    }
    

    Gruß



  • Die letzte Funktion könntest du noch verkürzen wenn du willst.

    void Uebergabe::showText() {
        OutputA->setText(InputA->text());
    }
    


  • Ja werd ich machen, vielen Dank für Deinen Tip. Was ich noch nicht so recht peile, wie das mit der Klasse "QString" ist. Beim meiner Version bilde ich ja da eine Instanz a der vordefinierten Klasse QString, das ist wohl irgendwie bei Deiner Version auch so. Aber das funktioniert ohne daß ich über include die Klasse QString überhaupt ausdrücklich eingebunden hätte. Oder steckt das verkappt in meinen beiden includes?
    Was mir auch irgendwie gefühlsmäßig noch fehlt ist eine Initialisierung meines Ausgabefeldes OutputA bevor ich den Ausgabetext dann reinschreibe. Das OutputA ist doch quasi ein Zeiger auf mein zweites LineEdit Objekt und ein nicht initialisierter Zeiger ist doch keine so gute Sache. Offenbar scheints auch ohne zu funktionieren, aber kannst Du mir das erklären?

    Gruß abacus



  • Also, schau mal nach ob dein QString bei dir in der Uebergabe.h inkludiert wird.
    Wo hast du den dein Textfeld InputA erstellt? Im Designer?
    Zeit mal deine header Datei



  • Meine Uebergabe.h habe ich weiter oben schon gepostet, da steckt als include die ui_Uebergabe.h drin. Und in der tauchen folgende includes auf:

    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QHeaderView>
    #include <QtGui/QLabel>
    #include <QtGui/QLineEdit>
    #include <QtGui/QMainWindow>
    #include <QtGui/QMenuBar>
    #include <QtGui/QPushButton>
    #include <QtGui/QStatusBar>
    #include <QtGui/QWidget>
    

    Ich hab mal Dokumentation gewälzt, die Klasse QString wird vererbt von
    QConstString, QDBusObjectPath und QDbusSignature aber die tauchen offenbar auch nicht auf. Ich vermute mal daß solche Klassen wie QLineEdit oder QLabel, QString auch brauchen, dann wird Designer das automatisch einbinden, nur womit.
    Gruß



  • QtGui/qlineedit.h:

    #include <QtCore/qstring.h>
    

    Da hat der Designer seine Hand nicht im Spiel.



  • <QtCore/QVariant>
    

    QVariant ist eine Art Wrapper/Metacontainer in die fast alle anderen Qt Datentypen reinpassen (schau mal hier: http://doc.trolltech.com/4.6/qvariant.html und guck was für Konstruktoren der hat)) ... da kommt dein QString her 😉 da der die (fast aber nicht alle) Anderen inkludiert

    // dein code
    

    schau unter http://doc.trolltech.com/4.6/qlineedit.html im Bereich der Signale, dann findest du: textChanged ( const QString & text ) . Damit gelingt dir ein
    connect(varNameQLineEdit, textChanged(const QString &), varNameTextOutput, setText(const QString &)); ohne eine eigenen Slot zu bemühen 😉



  • Vielen Dank an Euch beide, ich bin schon noch dabei, muß das mal in Ruhe anhand meiner Dokumentation nachvollziehen. Gruß



  • Ich hab mir die Sache komplizierter gemacht als sie ist und hatte ein paar Probleme mit der Syntax. Diese Version ist mehr durch Try and Error zustandegekommen:

    connect(InputA, SIGNAL (textChanged(QString)), OutputA, SLOT (setText(QString)));
    

    Das funktioniert ohne daß ich bei meiner Klassendefinition Signale oder slots angegeben hätte. Ich kann aber nicht behaupten, daß ich jetzt alles letztendlich verstanden hätte. Was mich als erstes drückt, ist die Frage woher die Memberfunktion setText seine Argumente bekommt, oder wird der QString tatsächlich innerhalb des connect-Statements weitergegeben? Ich war bisher der Meinung, daß die SIGNAL Funktion textChanged einfach darauf wartet, daß die Bedingung textChanged erfüllt ist und dann das Signal gibt die SLOT-Funktion die unter Connect angegeben ist auszuführen. Die Argumente für die setText-Funktion müßten aber dann woanders her kommen. Entschuldigung das klingt etwas wirr, vielleicht könnte mir aber trotzdem jemand einen Tip geben, wie das tatsächlich funktioniert.
    Gruß



  • Das connect() verknüpft nur ein SIGNAL mit einem SLOT. Sobald ein SIGNAL ausgelöst wird, werden die angebundenen SLOTS aufgerufen.
    Ein SIGNAL löst man aus, dabei gibt man ein Argument mit. Das Argument wird dabei direkt an den SLOT weitergereicht (DirectConnection) oder kopiert (QueuedConnection).
    So schaut das dann z.B. aus:

    class Emittent : public QObject
    {
      Q_OBJECT
    signals:
      void auswurf(const QString&);
    public slots:
      void starteAuswurf();
    };
    
    void Emittent::starteAuswurf() {
      emit auswurf(QString("Neuer Auswurf! BÄÄÄÄH, eklig!"));
    }
    

    Emittent hat jetzt ein SIGNAL(auswurf(const QString&)), an das man sich hängen kann. Das emit [...] löst das SIGNAL aus.
    Du kannst dich jetzt an das SIGNAL mit einem passenden SLOT hängen.

    Emittent *em = new Emittent;
    QObject::connect(em, SIGNAL(auswurf(const QString&)), reciever, SLOT(reagiereAufAuswurf(const QString&)));
    

    Mehr und natürlich genauer steht in der Doku:
    http://doc.qt.nokia.com/4.6/signalsandslots.html


Anmelden zum Antworten