QCopChannel *doChannel = new QCopChannel("QPE/Do", this); connect(doChannel, SIGNAL(received(const QCString &, const QByteArray &)), this, SLOT(doMessage(const QCString &, const QByteArray &)));
同时,需要在该类中定义相应的消息处理函数doMessage,
void Window1::doMessage(const QCString &msg, const QByteArray &args) { QDataStream stream(args, IO_ReadOnly); if(msg == "Message1(QString)") { QString text; stream >> text; button->setText(text); } else if(msg == "Message2()") { close(); } }
其中的Message1(QString)和Message2(QString)都是用户自己定义的消息,该函数中分别对这些消息进行了相应的处理。在该例中当收到带有参数的Message1消息时,将该字符串参数stream显示在按钮button上;当收到Message2消息时,将执行关闭Window1窗口的动作,当然用户可以根据需要自行编写相应的处理过程。
另一方面,在类Class2中需要发出消息的函数function中利用QCopEnvelope发送消息:
void Class2::function() { QCopEnvelope e("QPE/Do", "Message1(QString)"); e << param; }
这里发出了Message1消息,并将需要携带的参数param发送到管道中。
通过这样的过程,用户可以很方便地实现不同对象、不同进程之间通信过程,而且可以根据需要在通信过程中任意传递参数。
2、 信号-槽(Signal-Slot)机制
在Qt中,有一种用于对象之间的通信:信号-槽机制,这种机制是Qt的核心机制,也是它区别于其他GUI工具的最主要的特征。在大多数GUI工具中,通常为可能触发的每种行为定义一个回调函数,这个回调函数是一个指向函数的指针。在Qt中,信号-槽机制取代了这种繁杂的函数指针,能够实现同样的功能。信号-槽机制可以携带任意类型、任意数量的参数,而且完全是安全的,不会引起系统的崩溃。
所有由QObject类继承而来的类,或者是它的一个子类,都可以包括信号-槽机制。信号通常是当对象改变他们的状态时发出的,这就是一个对象在需要与其他对象通信时所需要做的一切,它并不知道是否有其他对象在另一端接收该信号。从这个意义上来说,这种机制实现了真正的信息封装,确保了对象可以被当作一个独立的软件构件来使用。
|