Wieso wird mein SLOT nicht aufgerufen?

Alles rund um die Programmierung mit Qt
Antworten
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Wieso wird mein SLOT nicht aufgerufen?

Beitrag von JoseMan »

Guten Morgen und Hallo an alle,

ich habe mal wieder ein Problem.
Ich wollte gerade anfangen zu eklären, aber ich zeige erst mein Code und dann schildere ich mein Problem.

Code: Alles auswählen

class MyTreeWidget : public QTreeWidget
{
	Q_OBJECT
public:
	MyTreeWidget (QWidget *parent);
	~MyTreeWidget ();

private slots:
	void myClicked(QTreeWidgetItem* item, int column);
};
Die Implementierung dazu:

Code: Alles auswählen

MyTreeWidget::MyTreeWidget(QWidget *parent)
	: QTreeWidget(parent)
{
	setColumnCount(1);

	setObjectName(QString("MyTreeView"));
	QMetaObject::connectSlotsByName(this);

	QTreeWidgetItem* item= new QTreeWidgetItem(this);
	insertTopLevelItem(0,item);

	QObject::connect(this,SIGNAL(itemClicked(QTreeWidgetItem*, int )),this,SLOT(myClicked(QTreeWidgetItem*, int)));
}
Mein SLOT habe ich wie folgt implementiert:

Code: Alles auswählen

void MyTreeWidget::myClicked(QTreeWidgetItem* item, int column)
{
	int t(0);
};
So, und nun zu meinem Problem. Wenn ich den Item, den ich mal testweise im Konstruktor angefügt habe, anklicke, dann wird einfach nicht meine "myClicked(...)"-Methode (slot) angesprungen.

Was mache ich hier aslo falsch? Wer kann mir helfen?

Ciao + Gruß J---
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Woher weist du das dein Slot nicht angesprungen wird?
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag von JoseMan »

Ich habe einen BreakPoint in die Funktion "myClicked(...)" gesetzt, und dann debugged.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Breakpoint heisst net unbedingt das es nicht aufgerufen wird.

Was liefert connect als ergebnis zurück?
Mach mal nen

Code: Alles auswählen

 qDebug() <<"My Slot was called";
in deinen slot rein und schau dir die ausgabe der Anwendung an!
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag von JoseMan »

So ich habe das gesmacht, aber ich bekomme keine Ausgabe in meinem VS-Ausgabefenster.

Und ich bekomme "true" zurück bei den Connenct-Funktionen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn connect() true zurückgibt wird der Slot auch aufgerufen. Das Du keine Debug-Ausgabe siehst liegt an M$ (subsystem windows)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag von JoseMan »

Ich habe mir mal meine "moc_MyTreeWidget.ccp" angeschaut. Qt hat da keine String erzeugt.
Normaler wesie steht doch sowas wie:

Code: Alles auswählen

static const char qt_meta_stringdata_MyApp[] = {
    "MyApp\0\0open()\0onClose()\0exportDlg()\0"
oder sowas in der Art. In meiner Moc-Datei steht da nur:

Code: Alles auswählen

static const char qt_meta_stringdata_MyTreeWidget[] = {
    "MyTreeWidget\0"
};
Ich habe meine ganze Projektmappe nochmal gerade erstellt, aber es ändert sich nix daran........??!!??
Kratzy974
Beiträge: 23
Registriert: 29. September 2009 13:25

Beitrag von Kratzy974 »

Bitte überprüf, ob du die richtige moc_..cpp anschaust (Release / Debug). Es wäre auch gut, wenn du diese Datei einmal selber erstellst (moc -o moc_any.cpp any.cpp) , um das noch einmal direkt zu überprüfen, dass du auch die richtige Datei mit kompilierst.
Normalerweise sollte eigendlich auch eine QWarning geworfen werden, welche darauf hinweist, dass der Slot nicht vorhanden ist. Ich empfehle die Qt Messages (QDebug / QWarning) sichtbar auszuwerfen (mit qInstallMsgHandler entsprechend abzufangen).

Grüße,

Kristian
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag von JoseMan »

Also ich habe die moc_...cpp mal gelöscht und die worde dann wieder neu, und soweit ich das überblicke, vollständig erstellt.
Es wird auch nix im Ausgabefenster ausgegeben. Also er findet die Signale und Slots, blso er reagiert nicht darauf.
Was mich wunder ist, dass er aber z.B. auf Signal "currentItemChanged(..)" richtig reagiert. Also es wird da der Slot meiner Klasse aufgerufen.
Ich weis echt nicht mehr weiter.

Meine Motivation war, ich will ein Treewidget haben, in der ich auf Maus-Tastendrücke reagieren kann. D.h. welches Item worde mit welcher Taste ausgewählt.

Gruß ....
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Schreib ein kleines Beispielprogramm damit wir es nachvollziehen können. Warum Du nichts siehst habe ich ja schon erklärt... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag von JoseMan »

Okay Christian81, so sehr ich dich auch *mag*, ich muss sagen, Du hast mir geholfen.
Ich habe ein Beispielprogramm erstellt, die genau das macht was ich oben schon beschrieben habe. Und es funktioniert einwand frei.

Was war los?
Ich hatte in meiner Klasse die Methode "mousePressEvent(...)" überschrieben. In ihr gab ich zum Test "qdebug()<< mousPressEvent" aus. Hat auch alles geklappt. ABER in der Doku steht:
Qt-Doku hat geschrieben:This function emits the pressed() signal.
Ich musst also zum am Ende der Funktion noch ein

Code: Alles auswählen

QTreeWidget::mousePressEvent(event);
setzen. Danach werden dann die Signale ausgelöst.

Dumm gelaufen, ist aber so. Jetzt weis ich es aber für das nächste mal.

Ciao + danke (*grmpf*)......
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Tja - das ist das lustige an virtuellen Funktionen - man sollte schon die Basisklassen-Funktion aufrufen. :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten