qdbus -> eigene Typen senden/empfangen

Alles rund um die Programmierung mit Qt
Antworten
Biski
Beiträge: 1
Registriert: 13. Juli 2009 19:03

qdbus -> eigene Typen senden/empfangen

Beitrag von Biski »

Hallo zusammen,

ich schreibe zur zeit ein programm mit interprozesskommunikation und verwende dazu das QTDbus modul. Es funktioniert soweit auch alles einwandfrei. ich verwende sehr viele enums und möchte diese auch als parameter für die signals angeben! wenn ich diese jedoch verwende kommt es zu keinem aufruf meines zugeordneten slots... ersetz ich diesen enum durch ein int funktioniert es. ich nehme an das problem liegt an dem generierten interface und adapter. diese lasse ich nach definition in einer xml datei mit dem QtDBus XML compiler (qdbusxml2cpp) generieren. dort liegt auch schon mein erstes problem, ich weiß nicht wie ich einen eigenen datentyp angeben kann. Ich gebe in der regel ein int an und ändere per hand den typ in mein enum. Weiß jemand wie ich in dem XML korrekt meinen typ angeben kann?

Code: Alles auswählen

 <signal name="playBackModeStatusSignal">
     <arg name="status" type="i" direction="out"/>
</signal>
das "i" steht für ein int, doch wie kann ich meinen eigenen enum angeben? wenn ich meinen eigenen typ angebe meckert qdbusxml2cpp, dass der typ unbekannt ist...

ein ausschnitt meiner klasse welche das signal vom interface dem slot zuweist:

Code: Alles auswählen


// enum liegt in einem seperaten header file...

class MediaPlayerProxy : public QObject
{	
	Q_OBJECT
	Q_ENUMS (hs::EPlaybackMode)
	
	public:	

		static MediaPlayerProxy& getInstance(EMPlayerInstanceId instanceId);
	...	
       void playbackModeSet(const hs::EPlaybackMode& mode);
		
	// Callbacks
	public Q_SLOTS:
		void playBackModeStatus(hs::EPlaybackMode state);
		
	...
};
Q_DECLARE_METATYPE( hs::EPlaybackMode ) 
meine signal -> slot zuweisung:

Code: Alles auswählen

	connect(interface, SIGNAL(playBackModeStatusSignal(hs::EPlaybackMode)), this, SLOT(playBackModeStatus(hs::EPlaybackMode)));
folgende methode vom mediaPlayerProxy ruft über das interface meinen slot von der gegenseite auf:

Code: Alles auswählen

void MediaPlayerProxy::playbackModeSet(const hs::EPlaybackMode& mode)
{
	interface->playbackModeSetDBusSlot(mode);
}
die signal auslösung auf der gegenseite wird in dieser methode realisiert:

Code: Alles auswählen

//mode parameter hat noch keine bedeutung
void MediaPlayer::playbackModeSetDBusSlot(int mode)
{
	cout << "---> playbackModeSetDBusSlot() called" << endl;
	emit playBackModeStatusSignal(hs::PBM_RANDOM);
}
Wie gesagt, tausche ich ich alle parameter mit der hand zu einem int, funktioniert alles... das problem liegt nicht an der umsetzung von meinem signal/slot mechanismus, sondern das ich meine eigenen enums nicht verwenden kann. hat jemand eine idee?

gruß
biski
Antworten