Seite 1 von 1

Wieso wird mein SLOT nicht aufgerufen?

Verfasst: 28. September 2009 09:34
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---

Verfasst: 28. September 2009 20:41
von upsala
Woher weist du das dein Slot nicht angesprungen wird?

Verfasst: 29. September 2009 08:41
von JoseMan
Ich habe einen BreakPoint in die Funktion "myClicked(...)" gesetzt, und dann debugged.

Verfasst: 29. September 2009 08:45
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!

Verfasst: 29. September 2009 09:54
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.

Verfasst: 29. September 2009 10:02
von Christian81
Wenn connect() true zurückgibt wird der Slot auch aufgerufen. Das Du keine Debug-Ausgabe siehst liegt an M$ (subsystem windows)

Verfasst: 29. September 2009 10:12
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........??!!??

Verfasst: 29. September 2009 14:18
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

Verfasst: 29. September 2009 14:54
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ß ....

Verfasst: 29. September 2009 15:02
von Christian81
Schreib ein kleines Beispielprogramm damit wir es nachvollziehen können. Warum Du nichts siehst habe ich ja schon erklärt... :roll:

Verfasst: 29. September 2009 15:37
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*)......

Verfasst: 29. September 2009 15:40
von Christian81
Tja - das ist das lustige an virtuellen Funktionen - man sollte schon die Basisklassen-Funktion aufrufen. :)