Seite 1 von 2
Auf Objekte zugreifen ..
Verfasst: 15. Mai 2010 18:16
von Barcardi
Ich bins wieder, ..
Ja sry ich nerve, aber ich will diese Qt Kacke lernen hab schon Hardcore Kopfschmerzen vom ganzen nachdenken, nach lösung suchen ETC..
Naja es ist ja möglich in der mainwindow.cpp per QMainWindow (MainWindow) zum ui Objekt oder was das auch ist zugriff zu erhalten, damit man änderungen ander GUI führen kann z.B. Label text ändern..
Das ist noch ein kleines Problem des ich bestimmt im falschen weg gelöst habe aber es dennoch klappt das ich darauf zugriff auch in der main.cpp habe, wozu gibt es eigentlich 2 cpp datein die sich nicht einma INCLUDEN VERDAMMT! Ich werd wahnsinnig.. Header datein von mir aus 1mio....
Naja das eigentliche Problem ist ich kappiere überhaupt nicht was diese Slot scheiße bewirken soll.. Signale verstehe ich noch.. mit clicked() u.s.w.
Aber was soll ich für ein Slot im Label einfügen?!! Man hatt ja anscheinend nur zugriff auf die Widgets wenn man Slots einfügt..
Als überblick meine jetzige main.cpp
Code: Alles auswählen
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <winsock2.h>
#include <windows.h>
#include "ui_mainwindow.h"
#include <string>
using namespace std;
int startWinsock() {
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0), &wsa);
}
void MainWindow::labelTextHandler(string ausgabe) {
ui->label->setText(ausgabe);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
if(0==0)
{
MainWindow::labelTextHandler("geht nicht!");
}
w.show();
return a.exec();
}
Fragt mich nicht wie ich auf den Slot "labelTextHandler" komme in einem Tutorial hatt jemand das mit nem Button "buttonClickHandler" gemacht, dafür.. Ohne Slot hatt man ja kein zugriff.
Leute und von der beschissenen Doku werd ich echt überhaupt nicht schlau.. Sry für die schreibweise aber vllt wisst ihr es selber Programmieren macht einen verrückt wenn man nicht weiter kommt..
Verfasst: 15. Mai 2010 18:35
von Herzogswalder
1. Um "Kacke" lernen zu wollen, bist du hier sicherlich falsch!
2. Wenn du die Programmierung unter Verwendung des Qt-Frameworks lernen willst, leg ich dir die ausgezeichnete Doku ans Herz!
Verfasst: 15. Mai 2010 20:01
von AuE
Sers,
sry aber deine Ausdrucksweise is für'n Arsch um mit deinen Worten zu sprechen.
Also ...
Was willst du tun... du verbindest im Ctor das Signal deines Buttons mit dem Slot deiner wahl. In dem Slot machst du dann ein ui->deinLabel->setText("und es geht doch");
das was du in deinem 0==0 machst is der aufruf einer statischen methode... geht natürlich auch.... wenn du sie als static deklariert hast!
Verfasst: 15. Mai 2010 22:49
von franzf
Bitte verbesser deine Ausdrucksform, insbesondere Wortwahl, sonst kann es passieren dass keine Antworten mehr kommen, oder die Threads geschlossen werden.
Zu der Verbindung: Den Buchlink den ich dir im anderen Thread gegeben hab, Kapitel 1.2. Und wenn es nicht das "connect" ist, was du haben willst, solltest du präzisere Fragen stellen.
Und zu guter Letzt: Das bisschen Code das da oben steht, hat mich fast dazu gebracht den Thread nach C++-Grundlagen zu verschieben. Zeig uns (mit mehr Code) dass das nicht notwendig ist...
Verfasst: 16. Mai 2010 06:21
von Barcardi
Das mit if soll nicht so eine abfrage beinhalten hab es einfach so eingefügte damit true rauskommt.
Also meine Frage wäre wie ich auf die Widgets (Label's, LineBoxen, etc..) zugriff kriege das ich z.B. den Text ändern kann. Ich hab da so ein Tutorial gesehen und wollt halt Fragen wozu man Slot's braucht bei nem Label zumindest.. Kann man anders auf die zugreifen, wenn ja will ich auf die Widgets unbedingt auf der main.cpp zugreifen mit dem Code ui->label->setText(); geht es doch, oder nicht?
Hier der Link zum VideoTutorial
Verfasst: 16. Mai 2010 09:40
von Christian81
Wenn ich mir den Code im ersten Post so anschaue - lern erstmal die C++ Grundlagen, dann sehen wir weiter...
Verfasst: 16. Mai 2010 09:50
von Barcardi
Oh mein Gott -.-
Verfasst: 16. Mai 2010 10:09
von franzf
Sowas geht NUR wenn labelTextHandler als static deklariert ist ("Klassenmethode").
In labelTextHandler greifst du auf ein ui zu. Das wiederum geht nur wenn "ui" im globalen Namensraum liegt. Das ist 1) mieses C++ und 2) für ein Widget das sehrwohl öfters auftauchen kann, absolut unmöglich zu verwenden, da dadurch jedes Widget über das UI die selben childs anzeigen soll. Es ist mir nicht bekannt, dass ein Window-System (also z.B. X11) eine Fensterrepräsentation an verschiedenen Stellen gleichzeitig anzeigen kann!
Desweiteren zeigt ein Blick in die Doku, dass QLabel keine Methode "setText(const std::string&)" kennt, sondern nur eine mit nem QString als Parameter.
Und warum hast du da noch die WinSock-Sachen drinnen?
Hast du denn C++ auch über Video-Tutorials gelernt? Das würde das mangelnde Wissen erklären, wie man auf Objekte zugreift.
Wenn es "nur" an dem Neuen was mit Qt dazu kommt liegen sollte, hier ein paar Links (auch zu den anderen Fragen):
http://doc.qt.nokia.com/4.6/designer-us ... -file.html (Du willst für den Anfang den "Single Inheritance Approach")
http://doc.qt.nokia.com/4.6/signalsandslots.html
http://doc.qt.nokia.com/4.6/examples.html
Und natürlich auf books.google.de das Buch (wenn es wie gesagt am Englisch hapert).
Ansonsten versuchs mal erst mit dem "C++ Primer", ist ein guter Einstig (und mehr) in C++. Der Stroustroup ist als Weiterführung empfehlenswert. Ohne C++-Grundlagen wirst du mit Qt auch nicht glücklich - leider

Verfasst: 16. Mai 2010 11:36
von Barcardi
Als erstes hab ich immer per Seiten bzw Tutorials auch Video Tutorials mangelhaft gelernt, aber das hatt überhaupt nicht gerreicht dann hab ich mir ein Buch gekauft der die Grundlagen sorgfälltig durchgeht und nicht irgendein 1000 Seitiges Buch mit dem ich mit den Kenntnissen nichts anfangen kann.. Ich hab mir "
Spielend C++ Lernen" gekauft von GalileoComputing, ich hab gehört da sind nicht alle Grundlagen dabei.. Beim letzen Kapitel geht er in die grundlagen der Klasse (OOP) ein, aber ich weiß nicht ob er da alles hingeschrieben hatt was man für Klassen wissen muss.
Edit: Da ich noch nicht bei QSocket's bin und erstmal schauen wollt ob ich es richtig begriffen hab mit den Widget's wollt ich erst paar Meldungen in die Label's bringen was ich nicht geschafft habe.
Verfasst: 16. Mai 2010 11:55
von AuE
Also: Die main macht bei den (einfachen) Qt Programmen nicht mehr als eine Instanz des MainWindows zu erstellen. Geh doch mal in dein MainWindow.cpp und dort in den Constructor.
Wenn du dort _NACH_ ui->setup(this); ein ui->deinLabel->setText("ES GEHT"); machst dann sollte das doch so angezeigt werden oder?
Danach kannst du einen Schritt weiter gehen. Wenn du einen Button auf dem ui hast machst du im Header File einen Slot (public slots: void meinSlot(); ) und dann im Constructor: bool bRes = connect (ui->deinButton, SIGNAL(clicked()), this, SLOT(meinSlot());
Und in meinSlot() machst du dann sowas wie ui->deinLabel->setText("Ein Signal hat mich verändert...");
hth
Verfasst: 16. Mai 2010 12:07
von Barcardi
Ahh jetzt wird es mir klar mit der main() Funktion, stimmt die erzeugt eigentlich nur das Fenster, der Rest wird durch Aktionen ausgeführt z.B. Button Klicks, falls ich es richtig verstanden habe.. Danke ich werd mal rumprobieren.
Verfasst: 16. Mai 2010 12:08
von franzf
OOP ist definitiv eine Sache, die sitzen muss! Das Qt-Framework arbeitet mit Klassen. Du musst wissen, was Ableiten bedeutet, was dabei zu beachten ist, Kapselung von Membern (private/protected/public), Typkonvertierungen, virtual, Überladung+Überschreibung von Methoden, templates uswusf.
Ein gewisses Maß kannst du doch mit den Büchern bei books.google.de erarbeiten. Die sind leider (aus Sicht des Autors zum Glück) nicht komplett, aber du kannst sehen, ob du mit dem Buch lernen kannst, ob es dir zu schnell vorwärts geht, ob Programmierung überhaupt etwas für dich ist (daran kann man arbeiten

). Wenn alles stimmt, dann kaufst du dir das Buch.
Der C++-Primer wird von allen Seiten als sehr kompetenter Einstig und Weiterführung zum fortgeschrittenen Programmieren empfohlen, da es im Gegensatz zu anderen Büchern eben umfangreich informiert, keine wichtigen Sachen verschweigt oder gar böse Schnitzer in den Beispielen bringt oder am Ende Vergewaltigung von Programmiersprache und Leser betreibt...
C++-Primer bei Google Books (auf Deutsch!)
Den
Stroustrup gibts da auch, ebenfalls Deutsch.
Und wenn du mal sehen willst, was man mit C++ so alles machen kann, schau mal
hier,
hier oder
hier. Letzters ist zwar bei google nur auf Englisch vorschaubar, gibts aber auch auf Deutsch.
Nicht erschrecken, die letzten 3 links sind eher für den sehr fortgeschrittenen Programmierer gedacht, die Basics sollten wirklich gut sitzen!
Verfasst: 16. Mai 2010 12:48
von Barcardi
Ja in meinem Buch werden z.B. nur public und private vorgestellt. Ich schlag dann mal zum "Klassen" Kapitel vor, ja die Google Bücher sind nicht alle vollständig, wird immer eine Seite ausgelassen..
Slots sitzt immer noch ned drinnen :S
Aber stimmt im Konstrukteur geht das mit ui =),
Code: Alles auswählen
bool bRes connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(meinSlot(ui->label->setText("test"))));
QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(meinSlot(ui->label->setText("test"))));
Beides wäre möglich doch warum setzen wir es in eine Variable?
Naja und in meinSlot kann ich ui->.... nicht setzen.. Habs mal so probiert:
Code: Alles auswählen
bool bRes = connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(meinSlot()));
meinSlot(ui->label->setText("test"));
Dann krieg ich error: invalid use of void expression
Und noch ne Fehlermeldung das ich die Variable bRes nicht ausgebe.
Verfasst: 16. Mai 2010 14:49
von franzf
Barcardi hat geschrieben:Code: Alles auswählen
bool bRes connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(meinSlot(ui->label->setText("test"))));
QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(meinSlot(ui->label->setText("test"))));
Beides wäre möglich doch warum setzen wir es in eine Variable?
Wir "setzen" es nicht in eine Variable. QObject::connect hat einen Rückgabewert (sowas können Funktionen haben), die anzeigt ob der connect geklappt hat:
Returns true if the connection succeeds; otherwise returns false.
. Und diesen Rückgabewert speichert er in "bRes". (da fehlt übrigens noch ein "=")
Naja und in meinSlot kann ich ui->.... nicht setzen.. Habs mal so probiert:
Code: Alles auswählen
bool bRes = connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(meinSlot()));
meinSlot(ui->label->setText("test"));
Dann krieg ich error: invalid use of void expression
Und noch ne Fehlermeldung das ich die Variable bRes nicht ausgebe.
Weil deine Funktion das so vorgibt? Du kannst nicht den Body einer Funktion willkürlich als Parameter mitgeben. Dein SLOT ist als
meinSlot() deklariert, er empfängt keine Parameter. Keine Parameter heißt "void", und für dieses erwartete "nichts" kannst du einfach nichts übergeben (mal etwas salopp formuliert, also schlagt micht nicht

).
Weils nichts mehr mit Qt zu tun hat -> Moved to "C++ Grundlagen".
Verfasst: 16. Mai 2010 15:07
von Barcardi
Achso so hab ich es verstanden:
Und in meinSlot() machst du dann sowas wie ui->deinLabel->setText("Ein Signal hat mich verändert...");
bool bRes = connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(meinSlot()));
Und hier krieg ich auch eine Fehlermeldung undefined reference to `MainWindow::meinSlot()'
Warum ist die GUI Programmierung so kompliziert/schwer???? Console ftw!