hakeの日記

Windows環境でプログラミングの勉強をしています。

C++でQTアプリ(その7) QCopメッセージ受信

ザウルスのQTアプリケーションではQCopを使って相互にメッセージのやりとりを行うことができる、その実験。
クラスQCopChannelを用いてQCopチャンネルを設定、QCopメッセージを受信するとシグナルreceivedが発生するので、connectを用いて処理を行うスロットに接続する。下のプログラムではメッセージtest()またはtest(QString)を受信した場合にその旨を表示、それ以外の場合はUnknownと表示するようにしている。
コンパイルしてできた実行ファイルrcvqcopを/home/QtPalmtop/binの下に置いて適当にアイコン登録して起動。ターミナルからQCopメッセージを送ってみる。

$ qcop QPE/Application/rcvqcop 'test()'
$ qcop QPE/Application/rcvqcop 'test(QString)' 'Send QCop Message'

ちなみにrcvqcop起動時と他のアプリから切り替えたときにはメッセージraise()を受信するのがわかる。

追記

QCopChannnelを使用しない方法もありました、7月28日の日記を参照

rcvqcop.h
#ifndef RCVQCOP_H
#define RCVQCOP_H

#include <qmainwindow.h>
#include <qmultilineedit.h>
#include <qcopchannel_qws.h>
#include <qdatastream.h> 
#include <qtextstream.h> 

class RcvQCop : public QMainWindow{
	Q_OBJECT
public:
	RcvQCop(QWidget *parent = 0, const char *name = 0);
//	~RcvQcop();
private:
	QMultiLineEdit *eb;

private slots:
	void printQCop(const QCString &m, const QByteArray &d);

};

#endif
rcvqcop.cpp
#include "rcvqcop.h"

RcvQCop::RcvQCop(QWidget *parent, const char *name)
		: QMainWindow(parent, name)
{
	setCaption("QCop Receive Test");

	eb = new QMultiLineEdit( this );
	setCentralWidget( eb );
	eb->clear();
	
	// QCopチャンネルを設定して、SLOTに接続する。
	QCopChannel *channel = new QCopChannel( "QPE/Application/rcvqcop", this );
	connect(channel, SIGNAL(received(const QCString&, const QByteArray&)),
		this, SLOT(printQCop(const QCString&, const QByteArray&)));

}

// test(),test(QString)のみ判別
void RcvQCop::printQCop(const QCString &m, const QByteArray &d)
{
	if (m == "test()"){               // 引数なし
		QString str;
		QTextOStream s_stream(&str);
		s_stream << "Rcv : Qcop Message\n";
		s_stream << m << "\n";
		eb->insertLine( str );

	}else if (m == "test(QString)"){  // 引数あり
		QDataStream d_stream(d, IO_ReadOnly);  // QByteArrayをストリームにして受ける
		QString s, str;
		d_stream >> s;  // 不等号の向きは>>でなければいけない。
		
		QTextOStream s_stream(&str);
		s_stream << "Rcv : Qcop Message\n";
		s_stream << m << "\n";
		s_stream << s << "\n";
		eb->insertLine( str );

	}else{     // その他のコマンド
		eb->insertLine( "Rcv : Unknown Qcop Message" );
		eb->insertLine( m );
	}
}