Seite 1 von 2

QT::connect -problem

Verfasst: Di Okt 26, 2010 4:28 pm
von naums
folgender Code:

Code: Alles auswählen

#include <QTGui>
#include <string.h>

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget *Window = new QWidget(0);
    Window->setWindowTitle("Ein kleiner Rechner zum ausprobieren :D");

    QVBoxLayout *inner = new QVBoxLayout(Window);
    QHBoxLayout *down = new QHBoxLayout(Window);
    QHBoxLayout *middle = new QHBoxLayout(Window);
    QHBoxLayout *up = new QHBoxLayout(Window);

    QLineEdit *left = new QLineEdit(Window);
    QLineEdit *mid = new QLineEdit(Window);
    QLineEdit *right = new QLineEdit(Window);
    QLabel *is = new QLabel(Window);

    QPushButton *plus = new QPushButton(Window);
    QPushButton *minus = new QPushButton(Window);
    QPushButton *multi = new QPushButton(Window);
    QPushButton *divi = new QPushButton(Window);

    plus->setText("ADDIEREN");
    minus->setText("SUBTRAHIEREN");
    multi->setText("MULTIPLIZIEREN");
    divi->setText("DIVIDIEREN");
    is->setText(" = ");

    up->addWidget(left);
    up->addWidget(mid);
    up->addWidget(is);
    up->addWidget(right);
    middle->addWidget(plus);
    middle->addWidget(minus);
    down->addWidget(multi);
    down->addWidget(divi);

    inner->addLayout(up);
    inner->addLayout(middle);
    inner->addLayout(down);

    Window->setLayout(inner);

    QObject::connect(plus,SIGNAL(clicked()),right, SLOT(setText(plus(left->text,middle->text))));

    Window->show();
    return app.exec();
}

int plus (int a, int b)
{
    QPushButton *push = new QPushButton(0);
    push->show();

    int c;
    c=a+b;
    return c;
}
Ich klicke also auf den Button plus aber es passiert nix, weder der QPushButon push wird angezeigt, noch wird c returned, denn wer aufpasst, sollte merken, dass ich kein atoi angewandt habe. soll heißen es müsste irgendwo in der Funktion plus(int a, int b) zu einem Fehler kommen. Warum also funktioniert das nicht?

Re: QT::connect -problem

Verfasst: Di Okt 26, 2010 4:52 pm
von cloidnerux
ch klicke also auf den Button plus aber es passiert nix, weder der QPushButon push wird angezeigt, noch wird c returned,
Das ist doch schon einmal ein Indiz dafür, dass plus gar nicht aufgerufen wird.
Das hängt damit zusammen, wie du das ganze Verbindest:
Normalerweise verbindest du das Signal eines Objektes mit dem entsprechenden Handler eines anderen Objektes.
Wenn dann irgendwann während der Laufzeit das Signal ausgelöst wird, dann wird die Hinterlegte Handler-Funktion ausgeführt.
Du hast aber, direkt beim verbinden die Funktion "plus" mit 2 Werten aufgerufen, und nicht mit der Funktion verbunden.
Hier findest du ausführlicheres:
http://doc.trolltech.com/4.7/signalsandslots.html

Re: QT::connect -problem

Verfasst: Di Okt 26, 2010 5:50 pm
von nufan
Ein Signal muss mindestens gleich viele Parameter haben wie ein Slot. Du kannst sie im Slot weglassen wenn du sie nicht brauchst, umgekehrt geht das aber nicht. Weiters erwarten die Macros SIGNAL und SLOT, die die enthaltene Funktion in einen String umwandeln, Typen und nicht Werte zwischen den Klammern. Du solltest zur Laufzeit eine Fehlermeldung bekommen. Selbst wenn das so funktionieren würde, bei "text" fehlen die Funktionsklammern, also bekommst du eine Adresse und keinen String.
"Window" im Konstruktor als Parent anzugeben ist unnötig, da durch das einfügen in Layouts sowieso alles automatisch festgelegt wird.
Außerdem finde ich es recht verwirrend, dass es ein Objekt und eine Funktion "plus" gibt.
Dein Code wäre allgemein deutlich leichter zu lesen, wenn du deine Variablen anders nennen würdest, am besten mit Hinweis auf den Typ. Z.B. "innerlayout" statt "inner" und "plusbutton" statt "plus".

Lösungsvorschlag:
Eine Klasse von QWidget ableiten (das wird dann später dein "Window"), im Konstruktor die Layouts, Buttons usw. erstellen und das Layout auf das QWidget anwenden. Dann innerhalb des abgeleiteten QWidgets einen Slot ohne Parameter implementieren und mit "clicked()" des jeweiligen Buttons verbinden. Im selbst implementierten Slot dann die Funktion "plus" aufrufen und das Ergebnis (als Text) an "setText()" des Widgets übergeben. Im main erstellst du dann nur mehr eine Instanz dieser Klasse und rufst "show()" auf.

Re: QT::connect -problem

Verfasst: Di Okt 26, 2010 6:29 pm
von naums
soll heißen, ich soll ne neue Klasse schreiben, von QWidget abgeleitet, und den ganzen Button-Spaß dortdrauf schieben. Dann dort drinne eine Funktion erstellen, die ich dann mit clicked() vom Button verbinde. In die Funktion kommt dann pretty much alles von plus rein, und die Werte an die LineEdits übergeben.

Okay. Probier ich gleich mal aus :D

Edit: okay, ich weiß, ihr habt schon abermals mir versucht zu erklären wie man zeugs in headerfiles und Cpp Files auslagert, aber ich verstehs immernoch ne. Wie erstelle ich ne Klasse aus einer Klasse, wie schreibe ich dann Slots und signals, wie , warum wie? wäre gut wenn mit Codebeispiel.

Re: QT::connect -problem

Verfasst: Di Okt 26, 2010 8:58 pm
von Dirty Oerti
main.cpp :
#include "klasse.h"
int main (int argc, char** argv) { //... }

klasse.h :
class MeineKlasse : public KlasseVonDerAbgeleitetWird
{
public:
MeineKlasse();
~MeineKlasse();
// ...
};

klasse.cpp :
#include "klasse.h"

MeineKlasse::MeineKlasse()
{
// ...
}
//...

-------------------------------------------------

Für deine Klasse legst du eine Headerdatei an, in die kommt die Deklaration+Definition der Klasse.
Dann legst du noch eine Sourcedatei an, in die kommt die Implementierng der Klasse. (Nicht vergessen diese Sourcedatei mit zu kompilieren und zu linken)

Von deinem Programm aus inkludierst du dann die Headerdatei.

Re: QT::connect -problem

Verfasst: Mi Okt 27, 2010 4:55 pm
von naums
wozu ist das "~" hier?

Code: Alles auswählen

~MeineKlasse();

Re: QT::connect -problem

Verfasst: Mi Okt 27, 2010 5:18 pm
von Xin
naums hat geschrieben:wozu ist das "~" hier?

Code: Alles auswählen

~MeineKlasse();
Das deklariert den Destruktor.
siehe hier: http://www.proggen.org/doku.php?id=cpp:class:destruct

Re: QT::connect -problem

Verfasst: Do Okt 28, 2010 4:52 pm
von naums
okay, was ist denn ein Destruktor, weil so weit wie ich das sehe, wird das dort auch nicht beschrieben. ^^

Re: QT::connect -problem

Verfasst: Do Okt 28, 2010 5:21 pm
von cloidnerux
okay, was ist denn ein Destruktor, weil so weit wie ich das sehe, wird das dort auch nicht beschrieben. ^^
Destructor = De + structor(von constructor) = De-Konstruierer^^
Also der Destructor wird aufgerufen, wenn das Objekt gelöscht wird, gedacht dazu wichtige schritte einzuleiten um z.B Speicherlecks zu umgehen, also z.B Speicher wieder frei geben.
http://en.wikipedia.org/wiki/Destructor ... science%29
Und mal wieder: ein wenig mehr Selbstinitiative bitte.

Re: QT::connect -problem

Verfasst: Do Okt 28, 2010 5:59 pm
von Xin
naums hat geschrieben:okay, was ist denn ein Destruktor, weil so weit wie ich das sehe, wird das dort auch nicht beschrieben. ^^
Aus dem Text:
"Um diesem Problem zu begegnen, gibt es in C++ den sogenannten Destruktor. Dies ist eine Funktion, die ein Objekt vor dem Löschen erst abbauen soll, also allen Speicher freigeben und in unserem Fall halt das Filehandle freigeben."

Wenn das nicht verständlich ist, formuliere bitte eine Frage, damit ich weiß, was unverständlich ist und überarbeitet werden sollte.