PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : connect



Mat
08-11-2005, 13:51
wie kann ich denn connect richtig nutzen?
also bei mir sagt er segmentation fault.....
anhand der docu schaffe ich es nicht...
danke für die geduld...bin ganz neu in C++ und Qt
mein code:



#include <qvariant.h>
#include <qdialog.h>
#include <qobject.h>
#include <qwidget.h>

class C1 public QWidget
{
Q_OBJECT
public:
C1(QWidget* page2);
~C1 ();


private slots:
void read();
};

und meine cpp:

C1::C1(QWidget* irgendwas )

{
connect( ??,SIGNAL( clicked() ), this, SLOT( read() ) );

}

void C1::read()
{

}

anda_skoa
08-11-2005, 14:31
?? hängt davon ab, wer das Signal aussendet.

Da in deinem Codeausschnitt keine Klasse so ein Signal hat, kann man nicht mal raten, welches du willst.

Ciao,
_

Mat
08-11-2005, 14:47
eh sorry....im grunde geht es mir nicht darum wer das signal sendet sondern dass es läuft... hier nochmal ein verständlihcerer code:


class C1 : public QObject
{
Q_OBJECT
public:
C1(QWidget* toolBoxPage);
~C1();

//Variables
QPushButton* b;


private slots:
void read();

};

C1::C1(QWidget* toolBoxPage)
{
b = new QPushButton("Get nodes", toolBoxPage, "b" );
b->setGeometry( QRect( 350, 50, 90, 28 ) );

QObject::connect( b, SIGNAL( clicked() ), this, SLOT( read() ) );
}

void C1::read()
{
cout << "jjj" << endl;
}

leider führt das dazu dass das "jjj" nicht erscheint.... warum ?
es gibt absolut keine fehler und warungen beim kompilieren und auch die gui wird gestartet....
nur bei klicken auf den button erscheint eben das "jjj" nicht ???

anda_skoa
08-11-2005, 16:11
Hmm, das sieht alles richtig aus.

Gibt es irgendwelche Ausgaben auf der Konsole wenn du da Programm startest?

Kannst du mal eine Ausgeb den connect Rückgabewertes einbauen, also etwas


bool connectOk = QObject::connect( b, SIGNAL( clicked() ), this, SLOT( read() ) );
qDebug("C1::C1: %s connneted", (connectOk ? "is" : "is not"));


Ciao,
_

Kirsche
08-11-2005, 16:13
Hallo Mat,

das große Problem bei den connects ist, dass keine Fehlermeldung ausgegeben wird, wenn was nicht stimmt.

Wohin soll dein cout denn eine Meldung geben? Geht das überhaupt? Bei mir klappt cout unter Visual C++ gar nicht.

Ich würde versuchen, in dem Slot eine QMessageBox auszugeben:

QMessageBox::information ( this, "Information", "Slot aufgerufen", QMessageBox::Ok , 0, 0 );

Falls das auch nicht klappt:

if(!QObject::connect( b, SIGNAL( clicked() ), this, SLOT( read() ) ))
{
QMessageBox::information ( this, "Information", "Connect falsch", QMessageBox::Ok , 0, 0 );
}

Wenn die Messagebox ausgegeben wird, ist dein connect falsch, ansonsten richtig.

Schöne Grüße,

anda_skoa
08-11-2005, 16:52
Das ist ein Windowsspezifisches Problem, weil da die Konsole nicht richtig funktioniert.
Da braucht man "console" in der CONFIG Zeile des .pro Files.

Unter anderen Plattformen bekommt man zur Laufzeit eine Warnung, wenn ein Connect nicht durchgeführt werden kann und auch Ausgaben mit cout, cerr oder qDebug funktionieren wie erwartet.

Ciao,
_

Mat
08-11-2005, 21:27
Hmm...danke aber ich arbeite unter debian Linux... Komischerweise funktioniert auch ein Disablen eines Buttons nicht als SLOT also irgendwie passiert bei den SLOTs gar nichts ?

@Kirsche:
Beide Ideen von dir bringen gar nichts. Es passiert einfach nichts. Keine MessageBox erscheint.

@Anda.
Das qdebug liefert: C1::C1 is connected

jetzt bin ich echt überfragt.

Kann es mit meinem Aufruf der Klasse zu tun haben?

Also ich erstelle ja in einer ganz anderen Klasse eine ToolBox mit pages. UNd dann rufe ich die Klasse
auf:
C1 c(page2);

also dem Konstruktor der Klasse C1 übergebe ich die page2.
Liegts daran?

anda_skoa
09-11-2005, 13:31
Wie lange existiert diese C1 Objekt?

Ciao,
_

Mat
09-11-2005, 19:23
oh man...
jetzt weiß ich echt nicht weiter....
was meinst du mit wie lange ? Ich destroye es nicht. Also ich rufe die Klasse so auf wie oben im code....

Mat
09-11-2005, 20:04
hmm vielleicht muss ich die klasse als Erbe von QDialog implementieren ? weil in meiner ursprungsklasse von der aus ich aufrufe...die ist erbe davon...
bloß wie geht das ?



in der cpp.
C1::C1( QWidget* parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, fl )

im header:
C1(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0);
und als erbe : public QDialog

und der Aufruf in der Ursprungsklasse:

C1 c(page2,0,FALSE,0)

geht aber nicht da segmentation fault...

Mat
09-11-2005, 20:47
Vielleicht nochmals mein Versuch als Text. Ich habe eine Klasse A. diese erbst von QDialog und in ihr erstelle ich eine ToolBox. Die erste page baue ich dort auch aus und alles funktioniert prima. Im Konstruktor dieser Klasse rufe ich nun eine zweite Klasse B auf und übergebe dem Konstruktor die zweite page der ToolBox. Klasse B erbt von QObject. Nun baue ich dort die page2 aus und das darstellen und positionieren der Widgets funktioniert auch. Wenn ich jetzt im Konstruktor der Klasse B connects ausführen möchte z.B einen QPushButton nur eine void Methode ausführen lassen will gibt es keine Compilierungsfehler und der Slot ist connected -> siehe Debug von vorigem Posting. Allerdings erscheint gar nichts. Also ob der SLOT gar nicht aufgerufen würde...??? Das ist doch nicht normal...? Zusatz: Wenn ich in Klasse B den connect ausführe aber dabei den SLOT nach KLasse A verfrachte gehts! Hmm........komisch

Zusatz2: Hmm kann es sein dass ich nur von QDialog erben muss...weil in der doku steht...QDialog is the class for all interaction with user...

Also wenn ich zum Beispiel einen Button disablen will durch einen anderen.....?

anda_skoa
10-11-2005, 14:44
hmm vielleicht muss ich die klasse als Erbe von QDialog implementieren ?

Nein, QObject ist schon in Ordnung.

Ich vermute, daß das Objekt nicht sehr lange lebt, wenn du es tatsächlich am Stack im Constructor der anderen Klasse erzeugst.
Denn dann wird sie zerstört, wenn der Konstruktor aus ist.

Du willst sie vermutlich am Heap erzeugen, also mit new

Ciao,
_

Mat
11-11-2005, 00:35
RESPEKT!!!
Tatsächlich :) Ich muss sie am Heap alloziieren....
Mein Gott. Jetzt im Nachhinein ist das immer so einleuchtend......
Wieder was wichtiges dazugelernt!

Danke Anda....was täte ich nur ohne dich ;)