QT - Einsteigerprogramm - Einfache Ein- und Ausgabe
-
Hallo,
ich bin neu hier und möchte gerne QT lernen. Ich habe zu Beginn eine Oberfläche in QT erstellt in der ich ein Eingabefeld (LineEdit) und ein Ausgabefeld (TextBrowser) habe.
Ich möchte lediglich in dem Eingabefeld Werte, z.b. einen String eingeben und diesen einfach im Ausgabefeld anzeigen lassen. (Nach dem ich den String eingegeben habe)Ich schaffe es aber leider nicht - nicht mal annähernd - einen funktionierenden Code zu erzeugen.
Ich bitte um Hilfe
Vielen Dank schon einmal,
sg
-
Beschäftige dich mal mit dem Signal/Slot-Mechanismus. Vom QLineEdit das Signal
returnPressed()
abfangen und dann im Slot mit
setText( QLineEdit.text() )
vom 'TextBrowser' die Eingabe des LineEdit in die Anzeige holen.Leider hast du nicht geschrieben, welche Anzeige du benutzt. Schreib mal ein wenig Code . . .
-
Hallo allerseits,
ich hab hier mitgelesen, weil ich etwa an der selben Stelle war wie angelus1988 und hab mal versucht ob ich das hinbekomme. Mein Prog besteht aus main.cpp, Uebergabe.cpp, Uebergabe.h und ist praktisch nur ein Hauptfenster mit einem QLineEdit zur Eingabe (InputA) und einem QTextBrowser (OutputA) zur Ausgabe. Wenn man das Connect Statement rausläßt kann ich es ohne Fehler kompilieren. D.h mein Problem reduziert sich darauf dem Programm zu sagen, wenn nach einer Texteingabe im QLineEdit Objekt "InputA" Enter gedrückt wird, soll an den Slot setText des Objekts QTextBrowser "OutputA" ein Signal gesendet werden den Text im Textbrowser auszugeben. Die Slotfunktion setText von QTextBrowser ist vererbt von QTextEdit. Im Connect-Statement stimmt offenbar der erste Teil, nur der zweite Teil mit dem SLOT liefert folgende Fehlermeldung: no such slot, QTextBrowser::setText(InputA->text()).
Ich sehe im Moment den Wald vor lauter Bäumen nicht, könnte mir jemand einen Tip geben wo der Knackpunkt liegt, der Code unten ist der meiner Uebergabe.cpp.#include "Uebergabe.h" Uebergabe::Uebergabe(QMainWindow *parent) : QMainWindow(parent){ setupUi(this); InputA -> setText("hier"); connect(InputA, SIGNAL (returnPressed()), OutputA, SLOT (setText(InputA->text()))); } Uebergabe::~Uebergabe(){}
Gruß abacus
-
Dein Slot ist eventuell nicht korrekt angegeben.
Du hast da eine Funktion eingefügt. Ist das ein Slot?connect(InputA, SIGNAL (returnPressed()), OutputA, SLOT (setText(InputA->text())));
Im SIGNAL muss dann aber der gleiche Übergabeparameter stehen, wie im Slot. Sonst wird das nichts.
Du musst also einen eigenen Slot schreiben (z.B. slotInsertText()), der dann den Text des LineEdit abfragt und an den Browser schickt.connect( InputA, SIGNAL( returnPressed() ), OutputA, SLOT( slotInsertText() ) );
Versuch aber auch mal andere Signale von QLineEdit auszuprobieren. Da bietet sich z.B. das Signal textChanged( const QString text ).
Wichtig ist halt, dass das Signal den Text gleich mitschickt, der über den connect-Mechanismus gleich an den Slot übergeben wird.
In der Doku kannst du alles über die Signale und Slots erfahren.
-
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