Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 |

2006-05-05(Fri)

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()を受信するのがわかる。

f:id:hake:20060505212206j:image:small


追記

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 );
	}
}

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20060505/p1