// 判断是否存在事件
7 Y+ ~3 r! l" e; K7 @- _% J9 } def hasEvent(name : String) : Boolean = _events.contains(name.toEventName). m/ H* a( l; f+ m
// Qt事件覆盖3 b9 m* n3 p' Y5 M# \
override def event(event : QEvent) : Boolean = {
0 I# y. j0 _9 r# n* f$ A# K( y3 J eventType2Name(event.`type`()) match {
2 Y4 _5 ~: Q& E; ^4 I case Some(name) =>: e' d! @; J$ M6 d
if (this.hasEvent(name)) {
/ @, q9 ^" k( D% T val handle = _events(name)。fire(this.asInstanceOf[T], event)0 M& E( Z+ G5 n
}
; m( G+ g G6 L case _ =>" l. K0 r( i6 ^
}( x9 X* E9 g7 P0 |
super.event(event)6 E- F0 | P) U; l
}
+ g8 k v$ t* u } " Y, M; v' I3 X+ I
这个Eventable只是一个很初步的封装,只是针对所有的QWidget适用,我还有好些想法,比如延时事件激活,定时事件循环。并且希望能对QObject进行全部的适用,而对于Qt的信号槽,自然也要兼容。唉,想法太多,可惜时间太有限。先用着吧,能好像写js一样写事件声明,该知足了。
6 I6 D' G, n& \; d# m 下面奉上使用的代码:! z ?, M o5 Q$ h8 Y$ m- H3 D
class Widget extends QWidget with Eventable[QWidget]; `9 L+ y$ |( T( y! g2 t+ H. x
val w = new Widget() w.addEvent("onClick", handle => {
. f8 l5 v0 S: q+ t' w println("单击了!") }) w.addEvents(
; K9 f! Q- Y: Q( k0 ] "show" -> { handle =>6 B T9 e. J" | [+ h I/ v; [) A
println("窗口显示了")% L8 F, B6 L/ i: h
},& Z3 a" ^& N. K. N
"doubleClick" -> { handle =>
) w+ }- ^9 f" y% Y println("双击了!")
p2 t; T1 ~% K9 m } ) |