[Gelöst] SIGNAL und SLOT werden ignoriert

Alles rund um die Programmierung mit Qt
Antworten
gwydion.dot
Beiträge: 9
Registriert: 18. März 2008 20:43

[Gelöst] SIGNAL und SLOT werden ignoriert

Beitrag von gwydion.dot »

Guten Tag zusammen,


Ich wollte gerade zwei connects machen aber diese weigern sich sturr zu funktionieren.


Zuerst zu meinem System:

Windows Vista
Visual Studio 2008
QT4.3 (kompiliert mit Visual Studio)


Ausschnitt:

header:

Code: Alles auswählen

class Wizard : public QWidget
{
	Q_OBJECT
    public:
        Wizard(QWidget *parent = 0);

    private:
        void startWizard();

	QWizardPage *createWelcomePage();
        QWizardPage *createGeneralPage();
	QWizardPage *createAccountPage();
        QWizardPage *createFinishPage();
        
        QWizard *confWizard;

	public slots:
		void finished(int);
		void createAccount();
};

cpp:

Code: Alles auswählen

..
QWizardPage *Wizard::createAccountPage()
{   
    QWizardPage *page = new QWizardPage;
    page->setTitle("Account Part - Step 2 of 2");

    QLabel *descLabel = new QLabel("In this part we are configuring your online account.\n");
    descLabel->setWordWrap(true);

	QLabel *accountLabel = new QLabel("If you have already an account please click on next, else click on \"Create a new account\".\n\n\n");
	accountLabel->setWordWrap(true);

	QPushButton *createButton = new QPushButton("Create a new account");

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(descLabel);
	layout->addWidget(accountLabel);
	layout->addWidget(createButton);
    page->setLayout(layout);
	
	connect( createButton, SIGNAL( clicked () ), this, SLOT( createAccount() ) );

    return page;
}
...

Code: Alles auswählen

void Wizard::createAccount()
{
	QMessageBox::information(this, "TEST","TEST");
}

Der Debugger gibt mir keine Fehler aus und ich weiss nicht woran es liegen könnte.


Danke für Hinweise und Anregungen im Vorraus :)
Zuletzt geändert von gwydion.dot am 16. November 2008 17:29, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Der Debugger gibt mir keine Fehler aus und ich weiss nicht woran es liegen könnte.
Und woher soll der Debugger wissen, was richtig und was falsch ist? Das hatten wir schon 100x .... wie immer:
* Forensuche verwenden
* Returnwert von connect prüfen!
* Konsolenausgabe kontrollieren: http://www.qtforum.de/forum/viewtopic.php?t=5854
gwydion.dot
Beiträge: 9
Registriert: 18. März 2008 20:43

Beitrag von gwydion.dot »

solarix hat geschrieben:
Der Debugger gibt mir keine Fehler aus und ich weiss nicht woran es liegen könnte.
Und woher soll der Debugger wissen, was richtig und was falsch ist? Das hatten wir schon 100x .... wie immer:
* Forensuche verwenden
* Returnwert von connect prüfen!
* Konsolenausgabe kontrollieren: http://www.qtforum.de/forum/viewtopic.php?t=5854
Guten Tag


Ui, ich hab mich ein wenig unklar gefasst das ist mir klar, aber gleich so eine raue Antwort hätte ich nicht erwartet. Aber danke für den Hinweise.


Ich meinte nicht nur den Debugger, war mein Fehler. Auf der Konsole gibt er nichts aus. Ich habe darum mal den Slot auf etwas gestellt wo es nicht gibt. Dieses wurde dann ausgegeben auf der Konsole.

Die Forensuche habe ich verwendete, konnte aber nichts finden. Habe wohl die falschen Schlagwörter verwendet.

Danke für den Tipp mit dem Return-Wert, werde ich gleich testen.
Connect liefert mir eine "1" zurück also true. Das sollte auch stimmen.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

aber gleich so eine raue Antwort hätte ich nicht erwartet.
Entschuldige... wir haben hier einfach zuviele "ich-bin-zu-faul-zum-doku-lesen"-Fragen.. Damit wir echte Probleme von diesen unterscheiden können, brauchen wir präzise Fehlerbeschreibungen...
[...]
Auf der Konsole gibt er nichts aus. Ich habe darum mal den Slot auf etwas gestellt wo es nicht gibt. Dieses wurde dann ausgegeben auf der Konsole.
[...]
Connect liefert mir eine "1" zurück also true. Das sollte auch stimmen.
Und die Info-Messagebox wird nicht angezeigt? Spannend... wird eine Debug-Ausgabe (qDebug() << "test") ebenfalls nicht ausgegeben? Falls nicht, kannst du mal ein kompletter Testcase (abgespecktes Projekt, reduziert auf dein Problem) als Anhang bereitstellen?
gwydion.dot
Beiträge: 9
Registriert: 18. März 2008 20:43

Beitrag von gwydion.dot »

Hi,


Ok. Kann ich verstehen, dann auch noch sorry von meine Seite für die ungenauen Angaben.


Ich konnte das Problem inzwischen lösen, auch wenn ich mir nicht ganz sicher bin wo der Fehler lag.

Die Klasse war von QWizard abgeleitet und anschliessend hab ich jede Page als QWizardPage <methode> definiert. Und habe die verschiedenen Pages per return an das QWizard-Objekt weitergegeben.

Ich bin dann zuerst nochmals die QT-Dokumentation durch gegangen, dort wurde für jede QWizardPage eine eigene Klasse definiert. Habe dann anschliessend den Code so angepasst das es nach dem Beispiel-Prinzip funktioniert. Anschliessend getestet und es lief einwandfrei.

Ich vermute das Problem lag darin, dass ich die Objekte nicht der ganzen Klasse zur verfügung stellte. Und der connect dadurch nicht ausgeführt werden konnte.

Konnte leider nichts dazu in der QT-Dokumentation finden aber mit der jetztigen Lösung bin ich eh glücklicher, schaut vom Code her viel besser aus.

Vielleicht weiss ja jemand mehr dazu, warum mein erster Ansatz nicht ging.
kokasurfer
Beiträge: 8
Registriert: 3. Juni 2008 10:38
Wohnort: Munich

Beitrag von kokasurfer »

Hallo zusammen,

ich habe dasselbe Problem, konnte es aber leider noch nicht lösen. Bitte deshalb um Hilfe und greife dieses Thema erneunt auf.

Mein System: Debian, Qt4.2, Kdevelop

Cpp bildausgabe:

Code: Alles auswählen

#include "bildausgabe.h"


Bildausgabe::Bildausgabe(QWidget * parent) : QMainWindow(parent)
{
	e = new QTextEdit("editor",this );
	setCentralWidget( e );

	//Dockwidget 1
	dock1 = new QDockWidget("dock1");
	this->addDockWidget(Qt::BottomDockWidgetArea, dock1);
	quelle = new Quelle();
	dock1->setWidget(quelle);

	//Dockwidget 2
	dock2 = new QDockWidget("dock2");
	this->addDockWidget(Qt::BottomDockWidgetArea, dock2);
	senke = new Senke();
	dock2->setWidget(senke);

	grd = new GetRtpData();

	qDebug() << "connect(Quelle,BA):  " <<
	connect( quelle , SIGNAL( [color=green]start_receiver_thread() [/color]), this, SLOT( start_thread() ));
}

//SLOT
void Bildausgabe::start_thread() {
	qDebug() << "Receiver Thread called ...";
	grd->run();

}
Cpp Quelle:

Code: Alles auswählen


        ...
	//while-loop with counter
	int count =0;
	while(!my_filestreamer_mn->my_vid_streamer)
	{
	usleep(2);count++;
	}
	qDebug() << "Source usleep(2) Counter: " << count;

	//starts client thread
	emit start_receiver_thread();

	qDebug() << "connect(Quelle,repaint):  " <<
	connect(this, SIGNAL(ready()), this, SLOT(change_frame()));

      ...
Das EMIT ist auch in keiner Schleife oder so, es steht einfach im Konstruktor. Die qDebug Ausgaben davor und dahinter werden auch angezeigt!


Header bildausgabe:

Code: Alles auswählen

#include <QMainWindow>
#include "quelle.h"
#include "senke.h"
#include "GetRtpData.h"

class QTextEdit;

class Bildausgabe: public QMainWindow
{
    Q_OBJECT

public:
    Bildausgabe(QWidget * parent = 0);
    ~Bildausgabe();	
	Quelle *quelle;
	Senke *senke;
	GetRtpData *grd;


private:

   	QTextEdit *e;
   	QString filename;
    	QDockWidget *dock1;
    	QDockWidget *dock2;

private slots:

	void start_thread();

};
Das Connect bei Quelle/BA gibt true zurück, es funktioniert aber leider nicht einmal die qDebug Ausgabe des SLOTs "start_thread()". Ich weiß nicht an was es liegen könnte. Ich habe die Q_OBJECTS eingefügt, alle verwendetetn Objekte deklariert und initialisiert. Auch die Konsole spuckt bei mir keinen Fehler aus. Ich habe schon einiges mit Signal und Slots gemacht, aber jetzt gerade stehe ich auf den Schlauch. Auch auf Schreibfehler hab ich schon alles durchsucht.
Kann mir jemand bei meinem Problem helfen?

Vielen Dank,
kokasurfer
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Erst connect, dann emit! Überleg mal was die einzige Möglichkeit ist, das im Konstruktor hinzubekommen.
kokasurfer
Beiträge: 8
Registriert: 3. Juni 2008 10:38
Wohnort: Munich

Beitrag von kokasurfer »

Stimmt, das habe ich übersehen. Ich wollte eben das SIGNAL nur einmal aufrufen und dachte dann eben schnell an den Konstruktor, aber nicht das der natürlich später aufgerufen wird.

Ich habe jetzt einfach noch einen Connect eingebaut. Am Ende des Bildausgabekonstruktors wird dann ein Signal aufgerufen,also nach meinem eigentlichen Connect. Der aktiviert dann einen Slot in dem Quelle Objekt, der dann weiderum mit einem Signal den Thread startet.

Ist ein bisschen wüst, klappt aber soweit. Gibts es da eine bessere Methode?

Vielen Dank.
Antworten