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