QT::connect -problem

Qt Programmierung, QML, Qt-Plattformen
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

QT::connect -problem

Beitrag von naums » Di Okt 26, 2010 4:28 pm

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?
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: QT::connect -problem

Beitrag von cloidnerux » Di Okt 26, 2010 4:52 pm

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: QT::connect -problem

Beitrag von nufan » Di Okt 26, 2010 5:50 pm

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.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: QT::connect -problem

Beitrag von naums » Di Okt 26, 2010 6:29 pm

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.
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: QT::connect -problem

Beitrag von Dirty Oerti » Di Okt 26, 2010 8:58 pm

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.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: QT::connect -problem

Beitrag von naums » Mi Okt 27, 2010 4:55 pm

wozu ist das "~" hier?

Code: Alles auswählen

~MeineKlasse();
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: QT::connect -problem

Beitrag von Xin » Mi Okt 27, 2010 5:18 pm

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
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: QT::connect -problem

Beitrag von naums » Do Okt 28, 2010 4:52 pm

okay, was ist denn ein Destruktor, weil so weit wie ich das sehe, wird das dort auch nicht beschrieben. ^^
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: QT::connect -problem

Beitrag von cloidnerux » Do Okt 28, 2010 5:21 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: QT::connect -problem

Beitrag von Xin » Do Okt 28, 2010 5:59 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten