重构widget代码,添加事件