QT - Einsteigerprogramm - Einfache Ein- und Ausgabe
-
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