QT - Einsteigerprogramm - Einfache Ein- und Ausgabe



  • Hallo Sanni, vielen Dank für die schnelle Antwort. Ich probiers morgen mal im Programm aus und melde mich dann.
    Gruß abacus



  • Das wird aber dein Kompilierproblem nicht beheben. Ich bin mir aber sicher, dass es nichtmal ein Kompilierproblem ist, sondern eines beim Linken. Vermutlich hast du nur "Q_OBJECT" in der Klassendefinition vergessen. Füge danach deinen Header im .pro auch unter "HEADERS" ein.

    Bitte in Zukunft, wenn etwas nicht kompiliert, eine aussagekräftige Fehlermeldung - idealerweise die des Compilers 😉 - mitposten, dann kann man statt zu Raten auch gleich helfen.



  • Meine Uebergabe.h sieht so aus

    #ifndef UEBERGABE_H
    #define UEBERGABE_H
    
    #include "ui_Uebergabe.h"
    
    class Uebergabe : public QMainWindow, public Ui::MainWindow{
    
        Q_OBJECT
    
    public:
        Uebergabe (QMainWindow *parent=0);
        ~Uebergabe();
    
    };
    
    #endif // UEBERGABE_H
    

    das Q_OBJECT ist also vorhanden und die Uebergabe.h ist im .pro File unter HEADERS angegeben. Der Kompiler an sich liefert gar keine Fehlermeldung, wenn ich das Programm aufrufe erscheint die Fehlermeldung "no such slot, QTextBrowser::setText(InputA->text()) wie oben angegeben.
    Ich hätte vor gehabt einen vordefinierten Slot zu verwenden, nämlich setText der Klasse QTextBrowser. Den hat sie aber nicht selbst sondern hat den Slot SetText von der Klasse QTextEdit geerbt.



  • 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