Seite 1 von 1

[gelöst] Signals/Slots - Slot wird nicht ausgelöst

Verfasst: 21. Oktober 2012 13:06
von Gardow
Hallo,

ich bin gerade dabei einen Midiplayer zu programmieren und komme leider nicht mehr weiter.
In meinem Player gibt es zwei Threads, der Hauptthread und ein Thread der für das Abspielen der Midi-Befehle zuständig ist. Die Threads sollen über Signal/Slot verbindungen kommunizieren. Allerdings wird ein Slot einfach nicht ausgelöst, habe schon mehrere Sachen versucht, aber es nützt nichts. Ich hoffe hier kann mir jemand weiter helfen. Aber erstmal die wichtigen Codestellen dazu:

Header des Midiplayers

Code: Alles auswählen

class MidiPlayer : public QWidget
{
	Q_OBJECT

public:
	MidiPlayer(QWidget *parent = 0, Qt::WFlags flags = 0);
	~MidiPlayer();

private:
	Ui::MidiPlayerClass ui;
	Reader m_reader;
	QStatusBar m_bar;
	Song m_song;
	MidiOutCycle m_cycle;
	QThread m_cyleThrd;

public slots:
	void loadFile();

signals:
	void addTrack(TrackOnDevice track);
};
Hier der Konstruktor

Code: Alles auswählen

MidiPlayer::MidiPlayer(QWidget *parent, Qt::WFlags flags)
	: QWidget(parent, flags)
{
	ui.setupUi(this);

	QObject::connect(ui.b_laden, SIGNAL(clicked()), this, SLOT(loadFile()));
	QObject::connect(ui.b_play, SIGNAL(clicked()), &m_cycle, SLOT(play()));
	QObject::connect(ui.b_pause, SIGNAL(clicked()), &m_cycle, SLOT(pause()));
	QObject::connect(ui.b_stopp, SIGNAL(clicked()), &m_cycle, SLOT(stop()));
	QObject::connect(this, SIGNAL(addTrack(TrackOnDevice)), &m_cycle, SLOT(addTrack(TrackOnDevice)));  //dieser Slot Funktioniert nicht!
	//QObject::connect(this, SIGNAL(addTrack(TrackOnDevice)), qApp, SLOT(aboutQt())); //das hier funktioniert aber

	m_cycle.moveToThread( &m_cyleThrd);
	m_cyleThrd.start();

	ui.verticalLayout_2->addWidget( &m_bar);

	m_bar.showMessage(tr("Bereit"), 3000);
}
der Header der Klasse die, das Signal empfängt

Code: Alles auswählen

class MidiOutCycle	: public QObject
{
	Q_OBJECT

	typedef std::multimap<unsigned int, Track*> Ch2TrckMap;	// Liste nach Channeln die die Tracks enthält.

private:
	/* ... */

public:
	MidiOutCycle();

public slots:
	void play();
	void pause();
	void stop();
	void setBPM(unsigned int bpm);
	void setRes(DWORD res);
	void addTrack(TrackOnDevice track);
	void removeTrack(Track *track, unsigned int device);
	void cycle();

signals:
	void finished();
	void tick();
};
Das ist der Slot der aufgerufen werden sollte, der Breakpoint den ich dort gesetzt habe wird allerdings nie erreicht

Code: Alles auswählen

void MidiOutCycle::addTrack(TrackOnDevice track)
{
	m_tracks.insert(track); 
}
achja hier noch der Typedef für TrackOnDevice

Code: Alles auswählen

typedef std::pair< unsigned int, Track*> TrackOnDevice;
Beim Debuggen habe ich mich an dieser Seite orientiert:
http://samdutton.wordpress.com/2008/10/ ... ots-in-qt/

Da ich hier wirklich am ende meines Lateins bin, wäre ich wirklich froh, wenn mir jemand sagen könnte wo der Fehler den liegt. Eine Alternativlösung für das Problem wäre natürlich auch super =)

Re: Signals/Slots - Slot wird nicht ausgelöst

Verfasst: 21. Oktober 2012 15:08
von Christian81
1. QObject::connect() hat einen Rüclgabeparameter den man auch auswerten kann
2. Wenn der connect nicht funktioniert wird zur Laufzeit eine Fehlermeldung auf die Konsole ausgegeben (Für windows muss sie extra aktiviert werden: pro-file: config += console)
3. Du übergibst einen User-Spezifischen Typ im Slot -> Doku: http://qt-project.org/doc/qt-4.8/qobject.html#connect

Re: Signals/Slots - Slot wird nicht ausgelöst

Verfasst: 21. Oktober 2012 16:36
von Gardow
Vielen Danke für schnelle Antwort Christian!

Das mit dem User-Spezifischen Typ habe ich nicht beachtet. Es gab auch in der Konsole die entsprechende Fehlermeldung.

Für diejenigen die ein ähnliches Problem haben hier noch die Zeile Code, die mein Problem gelöst hat:

Code: Alles auswählen

qRegisterMetaType<TrackOnDevice>("TrackOnDevice");
Damit wird meine Klasse also QMetaType registriert und kann somit auch für Signal/Slot-Verbindungen genutzt werde. Soweit ich es verstanden habe Funktioniert das aber nur, wenn die Klasse einen Standart-Konstructor, einen Copy-Konstructor sowie einen Destructor hat.