成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解 Qt QWidget對象的Eventable接口 (Scala實現(xiàn))

移動開發(fā)
本文介紹的是詳解 Qt QWidget對象的Eventable接口(Scala實現(xiàn)),對于Scala,本文又介紹,先來看內(nèi)容。

Qt QWidget對象的Eventable接口(Scala實現(xiàn))是本文將要介紹的內(nèi)容,Scala編程語言近來抓住了很多開發(fā)者的眼球。如果你粗略瀏覽Scala的網(wǎng)站,你會覺得Scala是一種純粹的面向?qū)ο缶幊陶Z言,而又無縫地結合了命令式和函數(shù)式的編程風格。

這個Eventable接口是我項目中常用的一個東西,scala強調(diào)FP,但是Qt Jambi本身是基于OOP的,事件重載需要在類里面進行。

在這個例子中,( http://my.oschina.net/janpoem/blog/7017 )大家可以看到經(jīng)常會這樣展開一個類去重載:

  1. new QLabel {  
  2.   override def xxxxEvent  

這種聲明的方法多了其實很容易讓人覺得不規(guī)范,而且閱讀也是不易。所以我萌生了讓將js那種聲明事件風格的代碼加入至此,js是一個可以很fp的語言,而scala也是,這不是一個很好的決定嗎?獻上具體的代碼:

  1. package yourporject.package  
  2. import scala.collection.mutable.{ ArrayBuffer, HashMap }  
  3. import com.trolltech.qt.gui._  
  4. import com.trolltech.qt.core._  
  5. import com.trolltech.qt.core.QEvent  
  6. import com.trolltech.qt.QSignalEmitter._  
  7. import com.agiers.mvc.Base  
  8. /*  
  9.  * Base類里面封裝了的是對于Java和Scala既有類的方法擴展,使用的是隱式混入的方式,不會改變對象本身。  
  10.  * 如  
  11.  * "onClick".toEventName => click  
  12.  * "中文字".encode => url encode  
  13.  * "繁體字".encodeSys => 這個是根據(jù)客戶端操作系統(tǒng)默認的字符編碼進行urlencode  
  14.  * "繁體字".toSimplified => 繁體轉(zhuǎn)簡體  
  15.  * "簡體字".toTraditional => 簡體轉(zhuǎn)繁體  
  16.  * "hello_world".toCamelCase => HelloWorld  
  17.  * "good guys".dump("temp.txt") => 將字符串內(nèi)容輸入到一個io文件中  
  18.  * "hello world".md5 => 將字符串md5加密  
  19.  */  
  20. trait Eventable[T <: QWidget] extends QWidget with Base {  
  21.   // 定義閉包的格式聲明  
  22.   // 凡是在Eventable里使用閉包的類型,應該首先使用Fn類型  
  23.   // 修改閉包類型,應該在此修改,而不在具體聲明的地方修改  
  24.   type Fn = EventHandle => Unit  
  25.   // 定義一個event的類型組合  
  26.   // 這個代表的實際上是String -> Fn或者(String, Fn)  
  27.   type Ev = (String, Fn)  
  28.   /**  
  29.    * 事件接管對象  
  30.    * 用于接管聲明事件時的閉包處理,并臨時寄存該閉包中的各種狀態(tài)和變量  
  31.    * @TODO 要逐漸增加他的寄存和讀取的接口  
  32.    * @author Janpoem  
  33.    */  
  34.   sealed case class EventHandle(val widget : T, val event : QEvent) {  
  35.     // 這個是用來獲取該widget執(zhí)行event時的狀態(tài)的  
  36.     private var _break = false 
  37.     // 以下  
  38.     def isBreak = _break 
  39.     def isBreak_=(is : Boolean) = _break = is 
  40.     def break(fn : EventHandle => Boolean) = isBreak = fn(this)  
  41.   }  
  42.   /**  
  43.    * 閉包的存放容器  
  44.    * 允許將閉包作為一個隊列存放,并在fire的時,按照隊列先后順序執(zhí)行。  
  45.    * @author Janpoem  
  46.    */  
  47.   sealed case class FnContainer(fn : Fn) {  
  48.       
  49.     private var fns = ArrayBuffer[Fn](fn)  
  50.       
  51.     def +(fn : Fn) : this.type = {  
  52.       fns += fn  
  53.       this  
  54.     }  
  55.       
  56.     def fire(widget : T, event : QEvent) : EventHandle = {  
  57.       val handle = EventHandle(widget, event)  
  58.       fns.foreach(_(handle))  
  59.       handle  
  60.     }  
  61.   }  
  62.   // 定義Qt標準時間類型轉(zhuǎn)換到當前類的助記名  
  63.   // name統(tǒng)一使用小寫  
  64.   // @TODO 要不斷增加QEvent.Type的內(nèi)容  
  65.   private val _eventsMap = HashMap[QEvent.Type, String](  
  66.     QEvent.Type.Show                -> "show",  
  67.     QEvent.Type.MouseButtonPress    -> "click",  
  68.     QEvent.Type.MouseButtonDblClick -> "doubleclick",  
  69.     QEvent.Type.FocusIn             -> "focus",  
  70.     QEvent.Type.FocusOut            -> "blur",  
  71.     QEvent.Type.Enter               -> "enter",  
  72.     QEvent.Type.Leave               -> "leave"  
  73.   )  
  74.   // 事件  
  75.   private val _events = HashMap[String, FnContainer]()  
  76.  
  77.   // 傳入Qt的QEvent.Type,獲取其在Eventable內(nèi)部的快捷助記名  
  78.   def eventType2Name(_type : QEvent.Type) : Option[String] = _eventsMap.get(_type)  
  79.   // 裝載事件  
  80.   // w.addEvent("show", handle => { /*  */ })  
  81.   def addEvent(s : String, fn : Fn) : this.type = {  
  82.     val name = s.toEventName  
  83.     if (!this.hasEvent(name))  
  84.       _events(name) = FnContainer(fn)  
  85.     else  
  86.       _events(name) + fn  
  87.     this  
  88.   }  
  89.   // w.addEvent("click" -> { handle => println(handle.event) })  
  90.   def addEvent(event : Ev) : thisthis.type = this.addEvent(event._1, event._2)  
  91.     
  92.   def addEvents(events : Ev*) : this.type = {  
  93.     events.foreach(this.addEvent(_))  
  94.     this  
  95.   }  
  96.   // 判斷是否存在事件  
  97.   def hasEvent(name : String) : Boolean = _events.contains(name.toEventName)  
  98.   // Qt事件覆蓋  
  99.   override def event(event : QEvent) : Boolean = {  
  100.     eventType2Name(event.`type`()) match {  
  101.       case Some(name) => 
  102.         if (this.hasEvent(name)) {  
  103.           val handle = _events(name).fire(this.asInstanceOf[T], event)  
  104.         }  
  105.       case _ => 
  106.     }  
  107.     super.event(event)  
  108.   }  

這個Eventable只是一個很初步的封裝,只是針對所有的QWidget適用,我還有好些想法,比如延時事件激活,定時事件循環(huán)。并且希望能對QObject進行全部的適用,而對于Qt的信號槽,自然也要兼容。唉,想法太多,可惜時間太有限。先用著吧,能好像寫js一樣寫事件聲明,該知足了。

下面奉上使用的代碼:

  1. class Widget extends QWidget with Eventable[QWidget]  
  2.  
  3. val w = new Widget()  
  4. w.addEvent("onClick", handle => {  
  5.   println("單擊了!")  
  6. })  
  7. w.addEvents(  
  8.   "show" -> { handle => 
  9.     println("窗口顯示了")  
  10.   },  
  11.   "doubleClick" -> { handle => 
  12.     println("雙擊了!")  
  13.   }  

小結:詳解 Qt QWidget對象的Eventable接口(Scala實現(xiàn))的內(nèi)容介紹完了,希望本文對你有幫助,更毒內(nèi)容請參考編輯推薦!

【編輯推薦】

  1. Scala編程指南:面向?qū)ο缶幊?/a>
  2. Scala編程指南 揭示Scala的本質(zhì)
  3. Scala編程指南 更少的字更多的事
  4. 新手必學 Qt 類簡介之Qt QWidget 類
  5. QWidget QMainWindow QDialog 三者區(qū)別
責任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關推薦

2011-03-18 19:37:38

Eventable接口QtWidget

2011-07-04 16:12:00

QT QWidget

2011-06-24 10:05:51

QT 對象 父對象

2011-06-16 11:13:13

QtQWidget

2011-03-18 19:50:32

ScalaJVMQt

2009-07-21 12:18:37

ScalaRational對象toString

2009-07-21 08:21:46

Scala對象相等性

2011-06-23 13:38:27

QT 元對象 信號

2011-06-30 09:46:01

QT 顯示視頻 linux

2010-03-22 13:15:07

Python支付接口

2011-06-28 15:18:45

Qt 單例模式

2009-09-09 14:09:35

Scala Trait

2009-07-22 09:22:20

Scala工廠對象

2009-08-31 16:23:13

C#接口

2011-06-24 13:27:13

Ubuntu QT SDK

2011-09-01 14:04:45

QT Webkit插件

2009-09-28 11:37:03

Journal.scaKestrel

2009-08-13 10:35:05

Scala數(shù)組排序

2009-09-09 11:14:16

Scala對象

2010-03-11 10:34:22

Scala
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区国产精品 | 国内精品久久久久久久 | 午夜成人免费视频 | 亚洲精品在线看 | 亚洲美女av网站 | 免费国产视频 | 自拍第一页 | 男女污网站 | 亚洲精品一区二区三区 | 久久三区| 午夜精品一区二区三区三上悠亚 | 欧美精品三区 | 99精品观看 | 久久久av| 男人天堂网址 | 日韩一级黄色毛片 | 久久久久亚洲 | 深夜福利影院 | 亚洲欧美成人 | 国产精品美女久久久久aⅴ国产馆 | 久久精品中文字幕 | 日本aaaa| 久久久久国产精品一区二区 | 国产精品久久久久久久久久三级 | 日韩精品在线一区 | 国产精品久久久久aaaa九色 | 亚洲va欧美va天堂v国产综合 | 欧美性a视频 | 久久久久久国产精品免费免费狐狸 | 青青草av在线播放 | 天堂资源最新在线 | 国产a视频| 午夜综合| 久久久在线视频 | 国产99久久精品一区二区300 | 91 在线| 天天拍天天插 | 99爱国产| 天天影视网天天综合色在线播放 | 久久久影院 | 国产高清久久久 |