自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解 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言,而又無縫地結(jié)合了命令式和函數(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里使用閉包的類型,應(yīng)該首先使用Fn類型  
  23.   // 修改閉包類型,應(yīng)該在此修改,而不在具體聲明的地方修改  
  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.   }  

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

【編輯推薦】

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

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 08:21:46

Scala對象相等性

2009-07-21 12:18:37

ScalaRational對象toString

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-07-22 09:22:20

Scala工廠對象

2009-09-09 14:09:35

Scala Trait

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-09 11:14:16

Scala對象

2009-08-13 10:35:05

Scala數(shù)組排序

2009-09-28 11:37:03

Journal.scaKestrel

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala
點贊
收藏

51CTO技術(shù)棧公眾號