ECMAScript 初探 - 對象篇

1、對象

若是你用過 C++ 或 Java,確定熟悉類(class)。在 ECMAScript 中並無 「類」 這個詞, 其對應的是 「對象定義」,不過這太拗口了,所以仍是詵擇使用 「類」 這個詞。linux

對象是由 new 運算符加上要實例化的類型的名字建立的。好比下面的代碼建立 Array 類的實例:正則表達式

var a = new Array();

在語法上與 C++ 相似。若是類的構造函數沒有參數,括號能夠省略;若是有多個參數, 則必須使用括號。爲了不混亂,筆者建議都使用括號。express

1.1 Objec

Object 類是全部 ECMAScript 類的基類,Object 類的全部屬性和方法都會出如今其餘類中,理解了 Object 類,就能夠更好地理解其餘類。編程

Object 類具備下列屬性:windows

  • constructor,指向建立對象的函數,對於 Object 類,它指向 object() 函數。
  • prototype,對該對象的對象原型的引用。暫時能夠將原型理解爲 C++ 中的類聲明,不過不一樣的是,ECMAScript 容許在運行時改變對象原型,而 C++ 中的類一旦聲明後, 其成員變量和方法都不可在運行時增刪。

Object 類還有幾個方法:數組

  • hasOwnProperty(property),判斷對象是否有某個屬性,property 爲字符串,好比 root.hasOwnProperty ("width」)。
  • isPrototypeOf(object),判斷該對象是否爲另外一個對象的原型。
  • propertylsEnumerable(property),判斷給定的屬性是否能夠用 for...in 語句進行枚舉。
  • toString(),返回對象的字符串表示。在 QML 中,不少 Qt 提供的類型,如 Rectangle, toString() 方法返回其對應的 C++ 類型名字或 QML 類型名字。
  • valueOf(),返回最適合該對象的原始值。對於許多類,該方法返回的值都與 toString() 同樣。

上面列出的每種屬性和方法均可能會被 Object 的派生類覆蓋。app


下面是使用上述方法的一個簡單的 QML 文檔:dom

import QtQuick 2.2

Rectangle { 
    id: root;
    Component.onCompleted:{
        var obj = new Object();
        console.log(obj.toString());
        console.log(obj.constructor);
        console.log(root.hasOwnProperty("width"));
        console.log(Item.isPrototypeOf(root));
        console.log(root.propertylsEnumerable("childrenM));
        console.log(root.toString());
        console.log(root.valueOf());
}

你可使用 qmlscene 加載上面的QML文檔來查看運行結果。函數


動態增長屬性工具

在 ECMAScript 中,對象的屬性能夠動態地增刪,很是有趣,與 C++ 這種強類型語言有 很大不一樣。好比下面的代碼:

var person = new Object();
person.name = "zhangsan";
person.year = 20;

咱們構造了一個對象 person,而後使用操做符設置其 name 屬性爲 zhangsan,year

屬性爲 20,而這兩個屬性本來是沒有的,是在對象已經建立以後添加的。


動態增長方法

對象的方法就是一個函數,也能夠動態地增長,而後按函數的方式調用。

person.printInfo = function printlnfo(){
    console.log("name -", this.name, "year -", this.year);
}
person.printlnfo();


使用數組下標訪問屬性和方法

沒有作不到的,只有想不到的,對象的屬性和方法竟然可使用數組下標來訪問。好比這樣:

console.log(person["name"]); // -> person.name 
person ["printlnfo"](); // -> person.printlnfo()

如你所見,使用數組下標訪問時,索引是表明屬性和方法名字的字符串,而不是咱們常見的整數。

咱們能夠把對象理解爲 Key-Value 對的集合,屬性、方法名就是 Key,其指向的,就是 Value。


對象的字面量表示法

前面介紹原始類型時提到了數字字面量、字符串字面量,其實對象也能用字面量表示。 例如:

var person = {
   "name": "zhangsan",
   "year": 20
}

對象的字面量表示法,語法是這樣的:使用一對花括號表示一個對象,其屬性以 Key:Value 對的形式放在花括號內,多個屬性之間使用逗號分隔;若是一個屬性自己是對象,還可使 用字面量表示法來嵌套描述。


1.2 String

String 類是 String 原始類型的對象表示法。其實 Boolean、Number 也有對應的對象表示 法,不過咱們通常都直接使用原始值,略過不提。

你能夠這樣構造一個 String 對象:

var str = new String("I\'m a string");

String 對象的 valueOf() 方法和 toString() 方法都會返回 String 類型的原始值。


String 類型比較複雜,本節重點介紹其基本功能。

(1)字符串長度

length 屬性返回字符串中的字符個數:

var str = new String("I\'m a string"); 
console.log(str.length);

上面示例輸出的是 12。對於 String 類型的原始值,一樣能夠經過 length 屬性獲知字符串長度。好比:console.log("I\'m a string".length);


(2)訪問單個字符

charAt() 方法能夠訪問指定索引位置的字符。前面己經介紹過,可使用數組下標的形式訪問字符串中的字符。而 charCodeAt() 方法返回指定位置字符對應的 Unicode 編碼。 下面是簡單的示例:

var str = new String("I\'m a string"); 
console.log (str. char At (2)); // 輸出:m
console • log (str [0]); // 輸出:I
console.log (str.charCodeAt (1)); // 輸出:39


(3)査找子串

indexOf() 方法從字符串的幵頭檢索子串,lastlndexOf() 方法從字符串的結尾開始檢索子串,它們返回給定的子串在本對象表明的字符串中的位置,若是找不到則返回 -1。這兩個方法還有一個可選的參數,指定開始查找的位置。

search() 方法用於檢索字符串中指定的子字符串,或檢索與正則表達式相匹配的子字符串。它是區分大小寫的。它老是從字符串的開始進行查找。

match() 方法可在字符串內檢索指定的值,或者尋找匹配指定正則表達式的一個或多個子串。若是檢索到了符合規則的子串,它會返回一個存放全部子串的數組。

須要注意的是,上面 4 個用於查找的方法,都是區分大小寫的。以一個忽略大小寫的正則表達式爲參數調用 search() 或 match() 方法,能夠實現忽略大小寫的查找。

下面是簡單的示例:

var str = new String("I\'m a string"); 

console.log(str.indexOf("ing")); // 輸出:9
console.log(str.search("i")); //輸出:9,而非 0
console. log (str.match("tri")); // 輸出:[tri]

var numberSource = new String ("2014-08-18, I got 96");
var results = numberSource.match(/\d+/g);
console.log (results.length); // 輸出:4
console. log (results); // 輸出:[2014,08, 18,96]


(4)字符串比較

localeCompare() 方法在比較字符串時,默認釆用底層操做系統提供的排序規則。當本對象等於參數字符串時此方法返回0,小於時返回小於 0 的值(QML中爲-1),大於時返回大於0的值(QML中返回1)。

示例代碼片斷:

var strl = "Qt Quick";
var str2 = "qt quick";
var str3 = "ok";

console.log (strl == str2); // 輸出:false
console.log (strl < str2); // 輸出:true
console.log (strl.localeCompare(str2)); // 輸出:1 
console.log (str3.localeCompare (str2)); // 輸出:-1


(5)鏈接字符串

concat() 方法用於鏈接兩個或多個字符串,返回一個新的字符串原始值。使用 「 + 」 運算符能夠更方便地鏈接字符串,效果和 concat() —樣。示例代碼片斷:

var strl = new String("Qt"); 
var str2 = "Quick";

var strResult = strl.concat(str2, " is", " great!");
console.log(strResult);
console.log(strl);
console.log(strl.concat (" Widgets"));
console.log(strl + str2);

注意,不管是 concat() 仍是 「 + 」,都不會在字符串之間插入填充字符。若是你想鏈接多個字符串而且指定它們之間的分隔符(填充字符),則可使用 Array 對象存儲字符串,而後調用 Array 的 join() 方法。


(6)提取子串

ECMAScript String 提供了 slice() 和 substring() 兩個方法來提取子串,它們接受一個或兩個參數,第一個參數指定起始位置,第二個參數指定結束位置(提取出的子串不包含該位置 的字符),若是忽略第二個參數,結束位置默認爲字符串的長度。

slice() 和 substring() 這兩個方法的不一樣之處在於對負數參數的處理。slice() 遇到負數參數時,會應用 「從串尾倒數」 這種策略,好比 slice(-3),會提取母串的後三個字符做爲子串; 而 substring() 方法會把負數參數做爲 0 處理,還有一點,substring() 老是把較小的參數做爲起 始位置,好比 substring(3, 1) 與 substring(1, 3) 效果同樣。

還有一個方法,substr() 也能夠提取子串,它的第一個參數指定起始位置,第二個參數指定要提取的字符個數,若是不指定,substr() 會返回從起始位置到母串結束的全部字符。 示例代碼片斷:

var source = new String ("I like QML"); 
console.log (source.slice (-3)) ; // 輸出:"QML"
console.log (source.slice (2,6)); // 輸出:"like"
console.log (source.substring (0, 6)); // 輸出:"I like" 
console.log (source.substring (-3) ); // 輸出:"I like QML"
console.log (source.substring (4, -3)); // 輸出:"I li" 
console.log (source.slice (4, -3)); // 輸出:"ke"
console.log (source.substr (2, 4)); // 輸出:"like"


(7)大小寫轉換

若是你想將一個字符串轉換爲小寫,可使用 toLowerCase() 或 toLocaleLowerCase() 方法:轉換爲大寫,可使用 toUpperCase() 或 toLocaleUpperCase() 方法。其中 toLocaleXXX 方法基於特定的區域實現,與 localeCompare() 相似。示例代碼片斷:

var orig = "Qt Quick";
console.log(orig.toLocaleLowerCase());
console.log(orig.toLowerCase());
console.log(orig.toLocaleUpperCase());
console.log(orig.toUpperCase());


(8)字符串替換

replace) 方法能夠將母串中的部分子串替換爲指定的新字符串。它的第一個參數是一個字符串原始值或者正則表達式,第二個參數是新字符串或產生新字符串的函數。

介紹子串查找時咱們用到了正則表達式,這裏還要用到,但正則表達式自己是一個很是複雜的主題,後面咱們會簡要介紹。示例代碼片斷:

var strSource = new String("Android,best");

// 下面語句輸出"iOS,best"
console.log(strSource.replace("Android", "iOS"));
// 下面語句輸出"Android,worst」
console.log(strSource.replace(/best/, "worst"));


(9)使用arg()進行值替換

QML 在實現 ECMAScript 時對 String 對象作了擴充,加入了 arg() 方法。若是你用過 Qt C++ 中的 QString 類,對此應不陌生。

arg()的語法:stringarg(value)。其中 value 能夠是數字、字符串、布爾值、對象等,它用來替換髮出調用的字符串對象內的 %一、°/二、%N 等佔位符;布爾值會被替換爲 1 或 0;對於對象,則使用 toString() 方法轉換後的結果來替換對應的佔位符。arg() 會返回一個新的字符串對象。簡單的示例:

var expression = "%1 < %2 = %3";
var result = expression.arg(7).arg(8).arg("true"); 
console.log(result);
console.log(expression.arg(10).arg(6).arg(false));
console.log("I am %1 years old.".arg(10));

值得注意的是,String 類型的對象是隻讀的,字符串提取、查找、替換等操做,凡是牽涉到修改的動做,都返回新的字符串原始值或對象,而母串自己不會改變。另外,字符串原始值是僞對象,它可使用String類的全部屬性和方法。


1.3 RegExp

在編寫處理字符串的程序時,常常會有查找符合某些複雜規則的字符串的須要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。在 QtC++ 中有 QRegExp,在 QML 中有 RegExp,它們是對字符串執行模式匹配的強大工具。

在 ECMAScript 中支持兩種構造正則表達式的方法:

  • 字面量語法:/pattem/attributes。
  • 建立 RegExp 對象:new RegExp (pattern, attributes)。

使用字面量這種方式,咱們在上面介紹 String 類的 match() 和 search() 方法時已經用到過。建立 RegExp 對象與字面量方式相似,它們都須要設置 pattern 和 attributes。


1.4 Array

ECMAScript 定義的 Array 是動態數組,其大小能夠動態變化。並且數組中的元素,類型能夠不一樣。這和 C++ 這種強類型語言就大大不一樣了。下面咱們來看看 Array 類的通常用法。


(1)建立數組

要定義一個 Array 對象,有三種方式。下面的代碼使用默認的構造函數:

var a = new Array();

下面的代碼指定數組對象的初始長度:

var a = new Array(10);

下面的代碼用給定的參數初始化數組:

var a = new Array(10, 6, 3, 21, 22, 30, 8);


(2)訪問數組

Array 類的 length 屬性表示數組中元素的個數。數組中的元素,能夠經過下標訪問。簡單的示例代碼:

var a = new Array(10, 6, 3, 21, 22, 30, 8);
console.log("array length - ", a.length);
console.log("2nd element - ", a[1]);


(3)修改數組

能夠直接使用下標運算符來添加元素,只需指定一個越界的索引便可,好比數組長度爲 4,你可使用a[4]=3這樣的語句來添加一個元素。你還可使用下標修改已經存在的元素。

  • 可使用 push() 方法向數組末尾插入一個或多個元素,它返回數組新的長度。你可使用 Pop() 方法刪除並返回數組的最後一個元素。

  • shift() 方法刪除並返回數組的第一個元素。unshift() 方法向數組的開始添加一個元素並返回新的數組長度。
  • reverse() 方法能夠顛倒數組中元素的順序。注意,它會改變原來的數組。 sort() 方法能夠對數組內元素排序並返回對原數組的引用。注意,它會改變原來的數組。 它有一個可選的參數 sortby,讓你指定一個比較大小的函數,若是你不指定,QML 的實現是將每一個元素轉換爲字符串,而後根據字符串比較的結果升序排列。

示例代碼片斷:

var a = new Array(10, 6, 3, 21, 22, 30, "zhangsan");
console.log("array length - ", a.length);
console.log("2nd element - ", a[1]);
console.log("7th - ", a[6]);

a[6] = "ZhangSanFeng";
a[7] = "XieXun"; a.push(250);
a.unshift(1); console.log(a.join(""));
console.log(a.shift ()); a.reverse ();
console.log(a.pop()); 
console.log(a.sort ());
console.log(a.pop()); 
console.log(a.pop());
console.log(a.sort());

輸出結果以下:

qml: array length w 7
qml: 2nd element ~ 6
qml: 7th _ zhangsan
qml: 1 10 6 3 21 22 30 ZhangSanFeng XieXun 250
qml: 1
qml: 10
qml: [21, 22, 250, 3, 30, 6, XieXun, ZhangSaiiFeng]
qml: ZhangSanFeng
qml: XieXun
qml: [21, 22, 250,3,30,6]


(4)轉換爲字符串

join() 方法能夠把數組中的全部元素組合成一個字符串,字符串之間能夠用給定的分隔符來填充。

toString() 方法能夠把數組轉換爲字符串,與不帶參數的 join() 方法結果同樣。 toLocaIeString() 方法能夠把數組轉換爲本地字符串。


(5)數組分隔與合併

concat() 方法能夠鏈接兩個或多個數組,它的參數既能夠是一個單一的值,也能夠是一個數組對象。它不會改變現有數組,而是返回一個新的數組對象。

slice(start, end) 方法與 String 類的 slice() 方法用法相近,它將母數組中 start 到 end (不含 end 位置的元素)之間的元素放到一個新數組中返回。示例代碼片斷:

var array = new Array("I", "like", "Qt", "Quick");
var subArray = array.slice(2, 4);
console.log (subArray.join(" "");
var newArray = array.concat ("!", subArray);
console.log(newArray.join(""));

newArray[0] = "Do you";
newArray.splice (4, 3, "?", "Yes", "!");
console.log(newArray.join(""));

輸出結果以下:

!qml: Qt Quick
qml: I like Qt Quick J Q+. Quick
qml: Do you like Qt Quick ? Yes !


(6)數組的字面量表示法

除了使用 new 來建立數組對象,還可使用字面量來表示數組。例如:

var a = [2, 3, 4, "?", "Quick"]
console.log(a.length, a[2]);

如上所示,數組的字面量表示法就這些要點:方括號([])定義一個數組,數組元素(原始值或對象)放在方括號內,多個元素之間使用逗號分隔。


1.5 Math

Math 對象用來執行數學運算,它有點兒特別,你不用使用 new 運算符構造對象,能夠直接使用。使用Math對象的代碼片斷:

var pi = Math.PI;
var textColor = Qt.rgba(Math.random(), Math.random(), Math.random());

Math有下列方法:

  • max(x, y),返回 x 和 y 中的最大值。
  • min(x, y),返回 x 和 y 中的最小值。
  • abs(x),返回數的絕對值。
  • sqrt(x),返回數的平方根。
  • pow(x, y),返回 x 的 y 次幕。
  • random(),返回 0〜1 之間的隨機數。

  • sin(x),返回數的正弦值。
  • asin(x),返回數的反正弦值。
  • exp(x),返回 e 的指數。
  • log(x),返回數的天然對數(底爲 e)。
  • valueOf(),返回 Math 對象的原始值。


1.6 Date

Date 對象用於處理日期和時間。你能夠這樣建立一個 Date 對象:

var today = new Date();

當使用無參構造函數建立 Date 對象時,該對象會自動把當前日期和時間保存爲其初始 值。實際上 Date 對象還能夠用下面的方式來建立:

new Date(value);
new Date(datestring);
new Date(year, month, day, hour, minute, second, millisecond);


示例:

var birthdayl = new Date("2009-10-21T22:24:00");
var birthday2 = new Date(2009, 10, 21);
var birthday3 = new Date(2009, 10, 21, 22, 24, 0);


下列方法能夠從 Date 對象中提取信息:

  • getDate(),返回一個月中的某一天(1〜31)。

  • getDay(),返回一週中的某一天(0〜6)。

  • getMonth(),返回月份(0〜11)。
  • getFullYear(),返回4位數字年份。
  • getHours(),返回小時(0〜23)。
  • getMinutes(),返回分鐘(0〜59)。
  • getSeconds(),返回秒數(0〜59)。
  • getMilliseconds(),返回毫秒(0〜999)。
  • getTime(),返回1970年1月1日至今的毫秒數。
  • toString(),把日期轉換爲本地字符串。


簡單的示例:

var d = new Date();
console.log(d.toString());
console.log(d.getFullYear(), d.getMonth(), d.getDate());
console.log("since 1970.1.1 - ", d.getTime());

輸出結果以下:

qml:週六十月 11 21:15:06 2014 GMT+0800
qml: 2014 - 9 - 11
qml: since 1970.1.1 - 1413033306317


Date 還有一些與 UTC 吋間相關的方法,如 getUTCDate()、getUTCDay()、getUTCMonth() 等。 下列方法能夠設置 Date 對象的相關信息:

  • seiDate(),設置月的某一天(1〜31)。
  • setMonth(),設置月份(0〜11)。
  • setFullYear(),設置 4 位數字年份。
  • setHours(),設置小時(0〜23)。
  • setMinutes(),設置分鐘(0〜59)。
  • setSeconds(),設置秒鐘(0〜59)。
  • setMilliseconds(),設置毫秒(0〜999)。
  • setTime(),以1970年1月1日至今的毫秒數設置 Date 對象。


Date 還有一些靜態方法,不須要建立 Date 對象就可使用,好比:

  • Date.now() 方法,返回從1970年1月1日凌晨至今的毫秒數。

  • Date.parse() 方法,解析一個時間字符串,返回那個時間距離1970年1月1日凌晨至今的毫秒數

  • Date.UTC(),解析 UTC 時間,返回那個時間距離1970年1月1日凌晨至今的毫秒數,它的參數是整型的年、月、日、時、分、秒、毫秒,至少提供年、月,就像構造函數同樣。

看一個使用 Date.now() 計算耗時的小示例:

var start = Date.now();
for(var i = 0; i < 10000000; i++);
var end = Date.now();

var elapsed = end - start;
console.log(elapsed);


Date 還有不少其餘的方法,能夠參考 Qt 幫助,請在索引模式下以 「Date」 爲關鍵字檢索。


1.7 你不可不知的對象碎碎念

在 ECMAScript 中,類(對象定義)是一個模板,它實例化以後,就是對象。對象由特性構成,特性能夠是原始值,也能夠是引用值。若是特性存放的是函數,它將被看做對象的 方法,不然該特性被看做對象的屬性。

換個角度來講,類定義了一個屬性和方法的集合,做爲構建對象的模板,使用new運算符構造對象的過程被稱爲實例化,而對象也常常被稱爲類的實例。

下面的代碼,根據類Array實例化了一個對象array:

var array = new Array();

如你所見,對象是用 new 運算符後跟要實例化的類的名字來建立的。array 是一個引用 值,至關於 C++ 中的指針,它只是做爲一個引用指向實際的物理對象。每次建立對象,存儲 在變量中的都是該對象的引用,而不是對象自己。


C++ 前輩們一兩告誡,new 出來的對象必定要 delete。這是 C++ 的遊戲規則,ECMAScript 不是這樣的!像 Java 同樣,ECMAScript 有垃圾收集器(GC,Garbage Collection),當沒有任何引用指向一個對象時,該對象就能夠被垃圾收集器回收、銷燬。而垃圾收集器可能在函數執行完畢後運行,也可能在實現 ECMAScript 的引擎以爲必要時運行。

把對象的引用設置爲 null,就能夠解除對對象的引用。例如:

var array = new Array();
array = null;

若是把對象的全部引用都設置爲 null,該對象就被廢除了,下次垃圾收集器運行時,就會銷燬對象。每用完一個對象,就經過設置引用爲 null 來廢除它,是個好習慣。


2、內置對象

ECMAScript 的內置對象,指的是那些不須要實例化就可使用的本地對象,ECMAScript 5 定義了三個內置對象:Global、Math 和 JSON。Math咱們前面己經介紹過 了,下面咱們重點講 Global,另外這裏再也不講解 JSON。

Global 對象

Global 對象很是特別,實際上,它是一個並不存在的對象! ECMAScript 有個有趣的概念:沒有獨立的函數和屬性,全部的屬性和函數都從屬於某個對象。所以,Global 對象應運 而生,接管了那些無家可歸的屬性和函數。

例如 NaN、Infinity、undefined 都是 Global 對象的屬性;全部本地對象的構造函數,像 Object、Array、String、Date、RegExp 等,都是 Global 對象的屬性,完整的列表請參考 Qt 幫助中的 ECMAScript Reference。

isNaN()、isFinite()、parselnt()、parseFloat(),都是 Global 對象的方法。最後要說的,也是最彪悍的一個方法:eval() 方法。它用來執行一段 ECMAScript,能夠 說它就是個 ECMAScript 解釋器。例如:

console.log(eval("5 + 2")); // 輸出:7

再看:

var s = "8+7";
console.log(eval(s)); // 輸出:15
var s2 = new String("9+10");
console.log(eval(s2)); // 輸出:9+10

注意,eval() 的參數是字符串,而且只能是原始字符串,若是你傳遞一個 String 對象給 它,它會原封不動地返回給你。


3、宿主對象 Qt

Qt 是 QML 提供的一個全局宿主對象,整合了經常使用的屬性、方法和枚舉類型,方便開發者引用。


1. Qt對象的屬性

(1)application 屬性

Qt.application 是一個對象,能夠經過它訪問應用的全局狀態。

  • application.state 表示應用狀態,有 Qt.ApplicationActive、Qt.Applicationlnactive、Qt.ApplicationSuspended、Qt.ApplicationHidden,你能夠望文生義,或者查閱 Qt 幫助來了解詳情。

  • application.layoutDirection 表明佈局方向,能夠取 Qt.LeftToRight、Qt.RightToLeft。
  • application.arguments 存儲應用啓動吋的參數。

  • application 還有 application.name、application.version、application.organization、application.

domain 這些屬性,請查閱 Qt 幫助。

  • application 有一個信號,aboutToQuit(),在應用要退出時發射,你能夠鏈接它來作一些清 理工做。它與 QCoreApplication 的 aboutToQuit() 是一個東西。


(2)platform 屬性

application.platform 是一個對象,platform.os 存儲操做系統的名字,多是:

  • "linux」 - Linux

  • "windows」 - Windows
  • "osx" - OS X

Qt 還有 inputMethod 屬性,詳情請參考 Qt 幫助。


2. Qt對象的枚舉類型

Qt 對象包含很是多的枚舉值,你在 Qt 幫助的索引模式下按關鍵字 「Qt Namespace」 檢索。

  • 按鍵枚舉類型:Qt.Key_0、Qt.Key_Emer、 Qt.Key Home 等。

  • 應用狀態:Qt.ApplicationActive、Qt.Applicationlnactive 等。

  • 佈局方向:Qt.LeftToRight、Qt.RightToLeft 等。

  • 窗口模態:Qt.NonModal、Qt.ApplicationModal、Qt.WindowModal。

  • 窗口類型標記,Qt.Window、Qt.Tool Window 對象的 flags 屬性就從這些值中取值。

  • 鼠標事件中,可使用Qt.LeftButton、Qt.RightButton....


3. Qt對象的方法

Qt 對象有一長串的方法,我們分類來看看。

(1)用於建立宿主類型

咱們可使用 Qt 對象提供的方法來建立某些 QML 提供的類型,用於給 Item 等對象的 某些屬性賦值,好比咱們前面用過的 Qt.rgba()。下面是完整的列表:

  • Qt.rect() 建立 rect 實例。
  • Qt.point() 建立 point 實例。
  • Qt.size() 建立 size 實例。
  • Qt.rgba()、Qt.hsla()、Qt.darker()、Qt.lighter()、Qt.tint() 等建立 color 類型的顏色值。
  • Qt.font() 建立字體。
  • Qt.vector2d() 建立 vector2d。


(2)格式化日期、時間

Date 類的 toLocaleString() 等 toLocaleXXX 系列方法有時也知足不了你們夥千奇百怪的奇葩需求,所以 Qt 對象提供了幾個方法用來格式化日期和時間。它們是:

  • string Qt.formatDateTime(datetime date, variant format)

  • string Qt.formatDate(datetime date, variant format)

  • string Qt.formatTime(datetime date, variant format)

說下 format,簡單地講,你能夠用相似於 「yyyy-MM-ddhh:mm:ss.zzz」 之類的字符串來描述日期和時間的輸出格式。舉個簡單的例子:

var today = new Date();
console.log(Qt.formatDateTime(today, "yyyy-MM-dd hh:mm:ss.zzz"));

上面的代碼將當前日期輸出爲相似於下面的字符串:

2014-08-22 14:51:05.406


(3)動態對象建立

對象動態建立,就會用到 Qt 對象提供的兩個方法,它們是:

  • object Qt.createComponent(url)
  • object Qt.createQmlObject(string qml, object parent, string filepath)

具體怎麼用,這裏再也不贅述。


(4)其餘方法

「其餘」 一直是個難以想象的詞兒,沒法分類的東西均可以歸到它下面。Qt 對象還提供這些方法:

  • Qt.quit(),退出應用,熟悉吧。

  • StringQt.md5(string),計算字符串的 MD5 值,返回的也是字符串。

  • stringQt.resolvedUrl(url),將傳入的相對路徑轉換爲全路徑。


參考:

《Qt Quick 核心編程》第5章 ECMAScript初探

相關文章
相關標籤/搜索