public class PropertyEvent extends EventObject {
public PropertyEvent(){}
}
2 定义监听者接口。
public interface PropertyListener extends EventListener {
public void propertyChanged(PropertyEvent propertyEvent);
}
3 定义事件激发者的接口。
public void add监听者(监听者);
public void remove监听者(监听者);
protected void process事件(事件);
4 实现事件激发者.
5 实现监听这接口。
MFC实践处理
DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CTApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
END_MESSAGE_MAP()
2.将创建的委托与特定事件关联 Public event delegateMe eventMe;
3.编写事件处理程序 public void Notify();NotifyEveryOne();
4.利用编写的事件处理程序生成一个委托实例 DelegateEvent eventSource = new DelegateEvent();
5.把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件 eventSource.NotifyEveryOne +=new event_test.DelegateEvent.MyDelegate(objA.DispMethodA);
6.使用此事件 eventSource.Notify();
![](http://www.qiliang.net/qt/abstract-connections.png)
当对象的内部状态发生改变,信号就被发射,在某些方面对于对象代理或者所有者也许是很有趣的。只有定义了一个信号的类和它的子类才能发射这个信号。
class Foo : public QObject
{
Q_OBJECT
public:
Foo();
int value() const { return val; }
public slots:
void setValue( int );//槽
signals:
void valueChanged( int );//信号
private:
int val;
};
当一个和槽连接的信号被发射的时候,这个槽被调用。槽也是普通的C++函数并且可以像它们一样被调用;它们唯一的特点就是它们可以被信号连接。槽的参数不能含有默认值,并且和信号一样,为了槽的参数而使用自己特定的类型是很不明智的。
Foo a, b;
connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));//连接
b.setValue( 11 );
a.setValue( 79 );
b.value();
QT的消息处理过程
bool MyClass:event( QEvent
if ( e-> type
QKeyEvent
if ( ke-> key
// 这里是特定的tab处理
k->accept();
return TRUE;
}
} else if ( e-> type
QCustomEvent
// 这里是自定义事件处理
return TRUE;
}
QWidget:: event
}