版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、QML 雜記 Tonkv翻譯Qt Quick簡介Qt Quick提供了一套高動態(tài),豐富的QML元素來定制用戶界面的說明性框架。Qt Quick有助于程序開發(fā)員與界面設(shè)計(jì)員的合作為便攜式設(shè)備建立流暢的用戶界面,例如:移動電話、媒體播放器,機(jī)頂盒以及上網(wǎng)本等。Qt Quick包含了QtDeclarative C+模塊,QML并且它們?nèi)徽系絈tCreate IDE中。使用QtDeclarative C+模塊可以從你的QT 應(yīng)用程序中載入QML文件并與之互動。QML是對Ja vaScript一種擴(kuò)展,它提供一種機(jī)制使用QML元素來說明構(gòu)建一個(gè)對象樹。QML對Ja vaScript與Qt現(xiàn)有的QOb
2、jec -tbase類型系統(tǒng)進(jìn)行整合改善;增加了自動屬性綁定的支持并提供在語言級別的網(wǎng)絡(luò)透明度。QML元素是一套先進(jìn)的圖形,就像搭積木方式那樣構(gòu)建界面。這些不同的元素是通過QML文檔來綁在一起的,從簡單的按鈕與滑塊到復(fù)雜完整的應(yīng)用程序,例如一個(gè)受歡迎的Flickr照片共享網(wǎng)站上的照片瀏覽器。Qt Quick是建立在Qt固有優(yōu)勢的基礎(chǔ)上。QML可被用于逐步擴(kuò)展現(xiàn)有的程序或創(chuàng)建全新的應(yīng)用程序。QML通過QtDeclarative 模塊來完全擴(kuò)展C+功能。入門QML語言入門QML是一個(gè)說明性語言,用來描述程序的用戶界面:它的外觀以及它的行為。在QML中,一個(gè)用戶界面作為一個(gè)帶有屬性的對象樹。本篇是為
3、有很少或沒有編程經(jīng)驗(yàn)的人準(zhǔn)備的。Ja vaScript是用來作為QML的腳本語言,所以你可能想對它了解多一點(diǎn)(Ja vaScript:The Definitive Guide),然后再深入QML。另外如HTML與CSS等Web 技術(shù)的基礎(chǔ)原理也是有幫助的;但它不是必需的。QML語言基礎(chǔ)QML類似這樣:import Qt 4.7Rectangle 語言島網(wǎng)站 1QML 雜記 Tonkv翻譯width: 200height: 200color: blueImage source: pics/logo.pnganchors.centerIn: parent對象是指定的類型,緊隨其后是一對大括號,對象
4、類型總是首字母為大寫。在上面的示例中,有兩個(gè)對象,一個(gè)Rectangle矩形與一個(gè)Image圖像。在大括號之間是關(guān)于該對象特定的信息,例如它們的屬性。屬性是以property屬性: value值形式指定的。在上面的示例中,我們可以看到圖像有個(gè)名為source來源的屬性,它的值被指定為”pics/logo.png”。該屬性與它的值是由冒號來分隔。屬性是由單行來輸寫:Rectangle width: 100height: 100或單行輸寫多個(gè)屬性:Rectangle width: 100; height: 100 當(dāng)單行輸寫多屬性/值時(shí),必須由分號來分隔開來。Import語句導(dǎo)入Qt模塊,它包含所
5、有標(biāo)準(zhǔn)的QML元素。如果沒有Import語句;那么Rectangle與Image元素將無效。表達(dá)式除了賦值屬性外;你也可以用JavaScript編寫的表達(dá)式來指定。Rotation angle: 360 * 3這些表達(dá)式可以包含其它的對象與屬性的引用,在這種情況下就會建立約束關(guān)聯(lián):當(dāng)該表達(dá)式改變值語言島網(wǎng)站 2QML 雜記 Tonkv翻譯時(shí);該屬性值將自動更新。Item Text id: text1text: Hello WorldText id: text2text: text1.text在上面的示例中,text2對象將顯示與text1相同的文本。如果text1改變值;那么text2也將自動
6、更新為相同的值。注意這里我們通過使用id值引用其它的對象。(詳情請參見id屬性信息)QML注釋在QML中的注釋類似于JavaScript。單選注釋以 / 開始。多行注釋以 /* 開始,以 */ 結(jié)束。import Qt 4.7注釋是不被執(zhí)行的,添加注釋可對代碼進(jìn)行解釋或者提高其可讀性。注釋同樣還可用于防止代碼執(zhí)行,這對跟蹤問題是非常有用的。Text text: Hello world!/opacity: 0.5在上面的示例中,這個(gè)Text對象將正常顯示,一旦opacity: 0.5這行關(guān)掉注釋,這是以半透明方式顯示文本。屬性屬性命名屬性命名以首字母為小字(附加屬性除外)。語言島網(wǎng)站 3QML
7、雜記 Tonkv翻譯屬性類型QML支持許多類型的屬性(參閱QML基本類型)。基本類型包括整型、實(shí)數(shù)型、布爾、字符串、顏色以及列表。Item x: 10.5 / a real property.state: details / a string propertyfocus: true / a bool propertyQML屬性是有類型安全檢測的。也就是說,它們只允許你指定一個(gè)與屬性類型相匹配的值。例如,項(xiàng)目x屬性類型是實(shí)數(shù),如果你賦值一個(gè)字符串;那么將會得到錯(cuò)誤的信息。Item x: hello / illegal!id屬性每個(gè)對象可給予一個(gè)特定唯一的屬性稱之為id。在同一個(gè)QML文件中不可能
8、擁有與其它對象同名的id值。指定一個(gè)id可以允許該對象可以被其它的對象與腳本引用。下面的示例中,第一個(gè)矩形元素的id名為”myRect”。第二個(gè)矩形元素的寬度是引用的myRect.widtch,這意味著它將與第一矩形具有相同的width值。Item Rectangle id: myRectwidth: 100height: 100Rectangle width: myRect.widthheight: 200請注意,一個(gè)id首字符必須是小寫字母或下劃線并且不能包含字母,數(shù)字和下劃線以外的字符。語言島網(wǎng)站 4QML 雜記 Tonkv翻譯列表屬性列表屬性類似于下面這樣:Item children:
9、 Image ,Text 列表是包含在方括號內(nèi),以逗號分隔的列表元素。在你只分配單一項(xiàng)目列表的情況下,是可以省略方括號:Image children: Rectangle 默認(rèn)屬性每個(gè)對象類型可以指定列表或?qū)ο髮傩灾蛔鳛槠淠J(rèn)屬性。如果一屬性已被聲明為默認(rèn)屬性,該屬性標(biāo)記可以被省略。例如該代碼:State changes: PropertyChanges ,PropertyChanges 可以簡化成這樣:State PropertyChanges ,PropertyChanges 因?yàn)閏hanges是State類型的默認(rèn)屬性。分組屬性在某些情況下使用一個(gè).符號或分組符號形成一個(gè)邏輯組。分組屬
10、性可寫以下這樣:語言島網(wǎng)站 5QML 雜記 Tonkv翻譯Text font.pixelSize: 12font.bold: true或者這樣:Text font pixelSize: 12; bold: true 在元素文件分組屬性使用.符號顯示。附加屬性有些對象的屬性附加到另一個(gè)對象。附加屬性的形式為Tperty其中Type是附加property元素的類型。例如:Component id: myDelegateText text: Hellocolor: ListView.isCurrentItem ? red : blueListView delegate: myDeleg
11、ateListView元素附加ListView.isCurrentItem屬性到每個(gè)它創(chuàng)建的代理上。另一個(gè)附加屬性的例子就是Keys元素,它用于處理任意可視項(xiàng)目上的按鍵,例如:Item focus: trueKeys.onSelectPressed: console.log(Selected)信號處理器信號處理器允許響應(yīng)事件時(shí)處理動作。例如,MouseArea元素有信號處理器來處理鼠標(biāo)按下,釋放語言島網(wǎng)站 6QML 雜記 Tonkv翻譯以及單擊:MouseArea onPressed: console.log(mouse button pressed)所有信號處理器開始都是啟用的。有一些信號處
12、理器包含一個(gè)可選的參數(shù),例如MouseArea onPressed信號處理程序有鼠標(biāo)參數(shù):MouseArea acceptedButtons: Qt.LeftButton | Qt.RightButtononPressed: if (mouse.button = Qt.RightButton) console.log(Right mouse button pressed)QML教程這節(jié)內(nèi)容是通過QML入門教程來熟悉Qt Quick語言。當(dāng)然它不會面面俱到;只是重點(diǎn)讓大家熟悉主要語法與特性。通過這節(jié)幾個(gè)不同的步驟我們學(xué)習(xí)QML基本類型,使用屬性與信號來建立我們自己的QML組件;而且還要使用狀態(tài)與
13、變換的幫助來建立一個(gè)簡單的動畫。這節(jié)從迷你的“Hello World”程序出發(fā),在隨后的章節(jié)中將引入新的概念。這個(gè)教程的源代碼位于$QTDIR/examples/declarative/tutorials/helloworld文件夾下。教程1基本類型這是一個(gè)非常簡單的”Hello World”程序,它將介紹一些基本的QML概念。下圖是該程序運(yùn)行的結(jié)果。語言島網(wǎng)站 7QML 雜記 Tonkv翻譯這是該程序的源代碼:import Qt 4.7Rectangle id: pagewidth: 500; height: 200color: lightgrayText id: helloTexttext
14、: Hello world!y: 30anchors.horizontalCenter: page.horizontalCenterfont.pointSize: 24; font.bold: true逐步講解導(dǎo)入首先,我們必須導(dǎo)入我們這個(gè)范例需要的類型。大多數(shù)QML文件都將導(dǎo)入內(nèi)置的QML類型(類似于Rectangle,Image)這都包含在Qt內(nèi),使用:import Qt 4.7Rectangle元素Rectangle id: pagewidth: 500; height: 200color: lightgray我們聲明類型Rectangle為根元素。你可以使用它在應(yīng)用程序中創(chuàng)建一個(gè)基本塊
15、。我們這里給予它一個(gè)id作為標(biāo)簽以便稍后引用。在這種情況里,我們命名它為“page”。同樣也設(shè)置width,height與color屬性。Rectangle元素還包含許多其它的屬性(例如x與y);但這些我們保留它們默認(rèn)的值。Text元素Text id: helloText語言島網(wǎng)站 8QML 雜記 Tonkv翻譯text: Hello world!y: 30anchors.horizontalCenter: page.horizontalCenterfont.pointSize: 24; font.bold: true這里添加一個(gè)Text元素作為根元素Rectangle的子級來顯示文本“Hel
16、lo World!”。這里的y屬性是用于定位文本從它父級頂部垂直距離30像素的位置。anchors.horizontalCenter屬性將參考一個(gè)元素的水平中心位置。在這里我們指定文本元素位于page元素的水平中心位置。font.poingSize與font.bold屬性是與字體設(shè)置相關(guān)。查看該范例為了查看你編寫好的程序,請運(yùn)行QML Viewr工具(位于bin文件夾下),用你程序文件名作為第一個(gè)參數(shù)。例如運(yùn)行這里提供的教程1范例,你需要這樣輸入命令行:bin/qmlviewer $QTDIR/examples/declarative/tutorials/helloworld/tutorial
17、1.qml教程2QML組件這節(jié)增加了一個(gè)顏色拾取器用于顏色該文本。我們的顏色拾取器是六格不同顏色的單元格。為了避免每個(gè)單元格重復(fù)多次相同的代碼,我們將創(chuàng)建一個(gè)新的cell組件。組件是定義一個(gè)新類型的方法,可以在其它的QML文件重復(fù)使用。QML組件類似于黑匣子通過屬性、信號以及函數(shù)與外部世界相互影響,通常是在自己的QML文件中定義的。(詳情請參見 定義新組件)。該組件的文件名必須以一個(gè)大寫字母開頭。Cell.qml的QML代碼語言島網(wǎng)站 9QML 雜記 Tonkv翻譯import Qt 4.7Item id: containerproperty alias cellColor: rectangl
18、e.colorsignal clicked(color cellColor)width: 40; height: 25Rectangle id: rectangleborder.color: whiteanchors.fill: parentMouseArea anchors.fill: parentonClicked: container.clicked(container.cellColor)逐步講解Cell組件Item id: containerproperty alias cellColor: rectangle.colorsignal clicked(color cellColor)
19、width: 40; height: 25我們組件的根元素是一個(gè)id名為 container的Item。Item是一個(gè)最基本的可視元素并經(jīng)常用作其它元素的容器。property alias cellColor: rectangle.color聲明一個(gè)cellColor屬性。這個(gè)屬性是從我們組件外訪問的,允許我們使用不同的顏色來實(shí)例化單元格。該屬性只是對現(xiàn)存的屬性使用了一個(gè)別名。signal clicked(color cellColor)語言島網(wǎng)站 10QML 雜記 Tonkv翻譯我們需要這個(gè)組件cellColor屬性帶有color類型的單擊信號,這將在稍后的主QML文件中使用到這個(gè)信號來改變
20、文本的顏色。Rectangle id: rectangleborder.color: whiteanchors.fill: parent我們單元格組件是id名為rectangle的顏色化矩形。anchors.fill屬性是設(shè)置元素尺寸的簡便辦法。在這種情況下矩形將擁有父級同樣尺寸的大小。MouseArea anchors.fill: parentonClicked: container.clicked(container.cellColor)為了單擊一個(gè)單元格來改變文本的顏色,我們創(chuàng)建一個(gè)MouseArea元素,它是與父級有同樣尺寸的。MouseArea定義了一個(gè)Clicked信號。當(dāng)這個(gè)信號
21、被觸發(fā)時(shí);我們發(fā)射使用顏色作為參數(shù)的單擊信號。主QML文件在我們的主QML文件中,我們使用Cell組件來創(chuàng)建顏色拾取器:import Qt 4.7Rectangle id: pagewidth: 500; height: 200color: lightgrayText id: helloTexttext: Hello world!y: 30anchors.horizontalCenter: page.horizontalCenterfont.pointSize: 24; font.bold: trueGrid id: colorPickerx: 4; anchors.bottom: page.
22、bottom; anchors.bottomMargin: 4rows: 2; columns: 3; spacing: 3Cell cellColor: red; onClicked: helloText.color = cellColor Cell cellColor: green; onClicked: helloText.color = cellColor Cell cellColor: blue; onClicked: helloText.color = cellColor Cell cellColor: yellow; onClicked: helloText.color = ce
23、llColor Cell cellColor: steelblue; onClicked: helloText.color = cellColor Cell cellColor: black; onClicked: helloText.color = cellColor 語言島網(wǎng)站 11QML 雜記 Tonkv翻譯我們在網(wǎng)格中放置六個(gè)單元格,使用不同的顏色來創(chuàng)建一個(gè)顏色拾取器。Cell cellColor: red; onClicked: helloText.color = cellColor 當(dāng)我們單元格的clicked信號觸發(fā)時(shí),需要傳遞cellColor參數(shù)來設(shè)置文本的顏色 。通過一個(gè)屬
24、性的onSignalName的命名方式來應(yīng)付組件的任何信號。教程3狀態(tài)與變換在這一節(jié)中,我們使用這個(gè)例子有更多的動態(tài),這里介紹狀態(tài)與變換。我們可以使用文本移動到屏幕的底部,當(dāng)單擊時(shí)旋轉(zhuǎn)并變成紅色。QML代碼:import Qt 4.7Rectangle id: pagewidth: 500; height: 200color: lightgrayText id: helloTexttext: Hello world!y: 30anchors.horizontalCenter: page.horizontalCenterfont.pointSize: 24; font.bold: trueMou
25、seArea id: mouseArea; anchors.fill: parent states: State name: down; when: mouseArea.pressed = truePropertyChanges target: helloText; y: 160; rotation: 180; color: red transitions: Transition from: ; to: down; reversible: trueParallelAnimation NumberAnimation properties: y,rotation; duration: 500; e
26、asing.type: Easing.InOutQuad ColorAnimation duration: 500 Grid 語言島網(wǎng)站 12QML 雜記 Tonkv翻譯id: colorPickerx: 4; anchors.bottom: page.bottom; anchors.bottomMargin: 4rows: 2; columns: 3; spacing: 3Cell cellColor: red; onClicked: helloText.color = cellColor Cell cellColor: green; onClicked: helloText.color =
27、 cellColor Cell cellColor: blue; onClicked: helloText.color = cellColor Cell cellColor: yellow; onClicked: helloText.color = cellColor Cell cellColor: steelblue; onClicked: helloText.color = cellColor Cell cellColor: black; onClicked: helloText.color = cellColor 逐步講解states: State name: down; when: m
28、ouseArea.pressed = truePropertyChanges target: helloText; y: 160; rotation: 180; color: red 首先我們對文本元素創(chuàng)建名為down的狀態(tài)。當(dāng)MouseArea被按下時(shí),這個(gè)狀態(tài)將被激活;當(dāng)鼠標(biāo)鍵釋放時(shí),將處于非激活狀態(tài)。down狀態(tài)包含一套從默認(rèn)狀態(tài)中的屬性改變(這在QML中已經(jīng)初始化定義過)。這里是設(shè)置文本的y屬性為160,旋轉(zhuǎn)180度并且設(shè)置為color為紅色。transitions: Transition from: ; to: down; reversible: trueParallelAnimat
29、ion NumberAnimation properties: y,rotation; duration: 500; easing.type: Easing.InOutQuad ColorAnimation duration: 500 因?yàn)槲覀儾幌M谋具\(yùn)動時(shí)出現(xiàn)不平滑的現(xiàn)象,這里在兩個(gè)狀態(tài)之間添加一個(gè)過渡。from與to定義兩狀態(tài)間的變換。在這里是從默認(rèn)狀態(tài)到down狀態(tài)的變換。因?yàn)槲覀冃枰獜膁own狀態(tài)返回到默認(rèn)狀態(tài)有同樣的變換,還需要設(shè)置reversible為ture。這等于分別寫了兩種變換。ParallelAnimation元素確保動畫的兩種類型(數(shù)值與顏色的變化)同時(shí)開始。我們同樣可
30、以使用SequentialAnimation來替代,它是序列進(jìn)行的,當(dāng)一個(gè)動畫完成后,再接著另一個(gè)動畫。利用QML 開發(fā)Qt 程序概要QML雖然并不需要了解Qt,但你已經(jīng)非常熟悉Qt;那么學(xué)習(xí)并使用QML是非常有必要的。因?yàn)橐粋€(gè)應(yīng)用程序可以使用QML做用戶界面,非界面邏輯部分可以使用Qt完成。語言島網(wǎng)站 13QML 雜記 Tonkv翻譯熟悉概念QML可以直接訪問Qt如下概念: QAction動作類型 QObject信號與槽在JavaScript里可作為函數(shù) QWidgetQDeclarativeView是一個(gè)QML顯示組件 Qt模型直接用于數(shù)據(jù)綁定(QAbstractItemModel)QML
31、項(xiàng)目與Qt組件的比較QML項(xiàng)目與Qt組件非常類似:它們定義的用戶界面外觀。有三種不同類型的QWidget結(jié)構(gòu): 簡單組件是不能作為父級的(如:QLabel,QCheckBox,QToolButton等等) 父級組件是可以作為其它組件的父級(如:QGroupBox,QStackedWidget,QTabWidget等等) 在內(nèi)部的子級組件的組合組件(如QComboxBox,QSpinBox,QFileDialog,QTabWidget等等)QML項(xiàng)目同樣也可以這樣分類。簡單組件有個(gè)非常重要的規(guī)則要記住,在C+實(shí)現(xiàn)的QDeclarativeItem是不包含任何界面外觀策略的,這是保留給該項(xiàng)目的QM
32、L用法。舉例說明,假設(shè)你需要一個(gè)可重復(fù)使用的按鈕項(xiàng)目。如果你決定聲明一個(gè)QDeclarativeItem子類來實(shí)現(xiàn)一個(gè)按鈕,就像QoTo lButton是QWidget的子樣一樣。如上面所述的規(guī)則那樣,QDeclarativeButton的沒有任何界面外觀,只是啟用概念,觸發(fā)等等。但在Qt里已經(jīng)有一個(gè)對象做這件事:QAction。QAction是QPushButton,QCheckB ox,QMenu項(xiàng)目,QoTo lButton以及其它可視組件的UI本質(zhì)無關(guān),通常綁定一個(gè)QAction。因此,在QML已經(jīng)完成了實(shí)現(xiàn)一個(gè)抽象這就是QAction。一個(gè)按鈕界面行為的外觀,狀態(tài)間的轉(zhuǎn)變以及如何響應(yīng)
33、鼠標(biāo)、鍵盤或觸摸輸入都應(yīng)留在QML里定義。QDeclarative eTxtEdit是基于QeTx tControl,QDeclarative WebView是基于Q Web Pageand ListView uses QAbstractItemModel, just as QeTx tEdit, QWebVie w, and QListView arebuilt upon those same UI-agnostic components.語言島網(wǎng)站 14QML 雜記 Tonkv翻譯QWidget封裝了界面外觀是非常重要的,對QML概念也服務(wù)同一目的。如果你開發(fā)一個(gè)完整的應(yīng)用程序,應(yīng)用有一致
34、的界面外觀。你應(yīng)該構(gòu)建可以重用的組件集。所以你要實(shí)現(xiàn)一個(gè)可以重復(fù)使用的按鈕,只需簡單的構(gòu)建一個(gè)QML組件即可。父級組件有時(shí)候需要把界面分成幾大類,每個(gè)類放任意個(gè)其它的部分。QaTbWidget就提供一個(gè)多“頁面“的界面,在任何時(shí)間只能切換到其中一個(gè)頁面。一個(gè)QScollAred提供一個(gè)滾動條來擴(kuò)大界面有效空間。幾乎所有的組件都可以直接在QML創(chuàng)建。只有少數(shù)情況下,需要非常特殊的事情處理,例如Filckable需要C+完成。QML相較于Qt組件的父級概念是有顯著差異的,子級項(xiàng)目是定位相對于它們的父級,在這里沒有需要它們被整個(gè)包含到父級。這種差異影響是深遠(yuǎn)的,例如: 圍繞組件的陰影或高亮可能是該組
35、件的子級。 粒子效果可以流到對象范圍以外。 變換動畫可以通過移動項(xiàng)目超出屏幕外來達(dá)到”隱藏“項(xiàng)目的目的。組合組件有些組件通過包含其它組件提供”實(shí)現(xiàn)細(xì)節(jié)“的功能。例如QSpinBox 是一個(gè)行編輯與兩個(gè)增加/減少值的按鈕。QFileDialog使用了一大堆組件來為用戶提供一個(gè)尋找與選擇一個(gè)文件名的方式。在開發(fā)可重復(fù)使用的QML項(xiàng)目時(shí);你可以選擇做同樣的事情:構(gòu)建你已經(jīng)定義的其它項(xiàng)目組成一個(gè)項(xiàng)目。唯一要考慮是你構(gòu)建的復(fù)合組件是用戶期望的那樣動畫與變換。例如一個(gè)微調(diào)框可能需要從任意文本或字符項(xiàng)目平常的過渡,因此微調(diào)框項(xiàng)目需要足夠的靈活性,允許這樣的動畫。QML項(xiàng)目與QGraphicsWidgets比
36、較QML項(xiàng)目與QGraphicsWidgets之間主要區(qū)別是如何使用。技術(shù)實(shí)現(xiàn)細(xì)節(jié)大致相同;但實(shí)際上它們是不同的,因?yàn)镼ML項(xiàng)目需要聲明與合成使用,QGraphicsWidgets是更為整合的使用。QML項(xiàng)目與QGraphicsWidgets都繼續(xù)自QGraphicsObject,可以并存。差別是布局系統(tǒng)與其它組件的接口。如QGraphicsWidgets趨向于將所有功能集為一身,一個(gè)QGraphicsWidgets可能有多個(gè)獨(dú)立的QML文件交叉許多QML項(xiàng)目組合而成的;但它仍然被C+載入與使用作為單個(gè)QGraphicsObject。語言島網(wǎng)站 15QML 雜記 Tonkv翻譯QGraphic
37、sWidgets是設(shè)計(jì)為被QGraphicsLayouts布局的。QML則不使用QGraphicsLayouts,由于Qt的布局器不能混合動畫與流體界面;所以幾何體界面是主要差別之一。當(dāng)編寫QML元素時(shí);可以使設(shè)計(jì)人員能夠使用絕對的幾何體,綁定或錨來放置它們的邊界矩形并不使用布局或尺寸伸縮器。如果尺寸適當(dāng)?shù)奶崾荆荒敲丛赒ML文件里放置它們,從而使設(shè)計(jì)者知道如何使用項(xiàng)目最好;但仍具有完全的控制界面外觀。其它區(qū)別在于QGraphicsWidgets往往遵循組件模式,它們是一個(gè)用戶界面與邏輯的自我包含綁定。與之相反的是QML通常是單一項(xiàng)目,就其本身并不滿足使用的情況。所以當(dāng)編寫QML項(xiàng)目,盡量避免做
38、UI邏輯或項(xiàng)目內(nèi)部合成可視元素;轉(zhuǎn)為編寫更為通用的基元,使外觀(如涉及UI邏輯)被編寫在QML中。兩者間的差別是由于不同的互動方式。QGraphicsWidget是QGraphicsObject子類使C+更容易開發(fā)流體用戶界面。QDeclarativeItem是QGraphicsObject子級使QML開發(fā)流體用戶界面。因此公開界面是主要區(qū)別之一以及使用它來設(shè)計(jì)項(xiàng)目(聲明元素用于QML而并QGraphicsWidget,因?yàn)槟阈枰帉懽约旱慕缑孢壿嫷阶宇悾?。如果你想同時(shí)使用QML與C+來編寫用戶界面,例如:緩進(jìn)過渡期,建議使用QDeclarativeItem子類(盡管你同樣可以使用QGraph
39、icsWidgets)。以允許更容易使用從c+使根項(xiàng)目的每一個(gè)c+組成一個(gè)布局器項(xiàng)目、載入單個(gè)的QML組件(可能是由多個(gè)QML文件,并包含一個(gè)獨(dú)立的用戶界面和邏輯)到你的場景來替換單獨(dú)的QGraphicsWidgets。使用QML程序設(shè)計(jì)入門歡迎來到QML,描述性UI語言的世界。在本入門指南中,我們將使用QML創(chuàng)建一個(gè)簡單的文本編輯器應(yīng)用程序??赐瓯局改虾螅銘?yīng)該可以使用QML與Qt C+開發(fā)自己的應(yīng)用程序了。QML構(gòu)建用戶界面這個(gè)應(yīng)用程序是一個(gè)簡單的文本編輯器,有載入、保存以及一些文本處理操作。本指南包括兩在部分。第一部分將涉及使用QML描述性語言設(shè)計(jì)應(yīng)用程序布局與行為。第二部分使用Qt C
40、+完成文件載入與保存功能部分。使用Qt的元對象系統(tǒng),我們導(dǎo)出C+函數(shù)作為QML元素屬性使用。利用QML與Qt C+我們可以有效的從應(yīng)用程序邏輯中分離出界面邏輯。語言島網(wǎng)站 16QML 雜記 Tonkv翻譯要運(yùn)行QML范例代碼,使用qmlviewer工具,以QML文件作為參數(shù)來查看。C+部分本教程是假設(shè)讀者具有Qt編程經(jīng)驗(yàn)的。定義一個(gè)按鈕與菜單基本組件按鈕我們開始構(gòu)建文本編輯器上的一個(gè)按鈕。功能上,一個(gè)按鈕有鼠標(biāo)敏感區(qū)與標(biāo)簽,當(dāng)用戶按下按鈕時(shí),按鈕執(zhí)行操作。在QML里,基本可視元素是矩形元素。矩形元素的屬性來控制元素的外觀與位置。import Qt 4.7語言島網(wǎng)站 17QML 雜記 Tonkv
41、翻譯Rectangle id: simplebuttoncolor: greywidth: 150; height: 75Textid: buttonLabelanchors.centerIn: parenttext: button label首先,impor t Qt 4.7允許qmlviewer工具導(dǎo)入QML元素,這將稍后使用。這一行是每個(gè)QML文件必須存在的。注意在impor t語句里Qt模塊的版本_號是被包括的。這個(gè)簡單的矩形擁有獨(dú)立唯一的標(biāo)識符simplebutton,它是綁定的id屬性。矩形元素的屬性由列表列出的屬性在冒號后面對應(yīng)值。在示例代碼中,矩形的顏色屬性為灰色,同時(shí)還決定的
42、矩形的寬度與高度。文本元素是一個(gè)不可編輯的文本域。我們命名這個(gè)文本元素為buttonLable。要設(shè)置文本域的字符串內(nèi)容,將綁定一個(gè)值到該文本屬性。該標(biāo)簽在矩形內(nèi)的中心位置,指定文本元素的錨到父級(simplebutton)。錨可以綁定到其它項(xiàng)目的錨,允許布局簡單分配。我們保存這段代碼為SimpleButton.qml。運(yùn)行qmlviewer來查看代碼運(yùn)行的效果。為了實(shí)現(xiàn)按鈕的單擊功能,我們可以使用QML的事件處理。QML事件處理是非常類似于Qt的信號與槽機(jī)制的。信號發(fā)射并鏈接到槽調(diào)用。Rectangleid:simplebutton.MouseAreaid: buttonMouseAreaa
43、nchors.fill: parent /anchor all sides of the mouse area to the rectangles anchors/onClicked handles valid mouse button clicksonClicked: console.log(buttonLabel.text + clicked )我們包含一個(gè)鼠標(biāo)區(qū)域(MouseArea)元素在我們的simplebutton中。鼠標(biāo)區(qū)域元素描述著互動區(qū),檢測鼠標(biāo)運(yùn)動。對于我們的按鈕,我們錨定的整個(gè)鼠標(biāo)區(qū)是它的父級(simplebutton)區(qū)域。anchors.fill語法是填充指定的區(qū)域內(nèi)
44、部。QML使用錨定來進(jìn)行項(xiàng)目布局。鼠標(biāo)區(qū)域 有很多的信號處理,就是鼠標(biāo)在指定的鼠標(biāo)區(qū)域邊界內(nèi)移動。它們中有一個(gè)是onClicked,它只接受鼠標(biāo)按鈕的單擊。默認(rèn)為左擊。我們可以綁定動作到onClicked句柄上。在我們的例子中,執(zhí)語言島網(wǎng)站 18QML 雜記 Tonkv翻譯行console.log()函數(shù),當(dāng)鼠標(biāo)單擊該區(qū)域時(shí)將輸出控制臺文本,它是用于調(diào)試與輸出文本的有用工具。在simpleButton.qml代碼里只要鼠標(biāo)單擊就會在控制臺輸出文本。Rectangle id:Bperty color buttonColor: lightblueproperty color on
45、HoverColor: goldproperty color borderColor: whitesignal buttonClick()onButtonClick: console.log(buttonLabel.text + clicked )MouseAreaonClicked: buttonClick()hoverEnabled: trueonEntered: parent.border.color = onHoverColoronExited: parent.border.color = borderColor/determines the color of the button b
46、y using the conditional operatorcolor: buttonMouseArea.pressed ? Qt.darker(buttonColor, 1.5) : buttonColor在Button.qml里是一個(gè)完整功能的按鈕。在本文中有些代碼被省略,由省略號表示了。因?yàn)樗鼈円丛谇懊嬲鹿?jié)有介紹;要么有些是現(xiàn)在不用去涉及的。自定義屬性是使用property類型命名語法聲明的。在該段代碼里,property buttonColor是聲明顏色類型并綁定”lightblue”。buttonColor是稍后用在條件操作中來決定按鈕的填充顏色。注意屬性值使用=等號賦值是有可
47、能的,另外值綁定是使用冒號。自定義屬性允許內(nèi)部項(xiàng)目訪問矩形范圍外的。在這里是基本的QML類型,例如:整型、字符串、實(shí)數(shù)型以及變體類型。通過綁定onEntered與onExited信號句柄到顏色,當(dāng)鼠標(biāo)懸停在按鈕上面的時(shí)候該按鈕的邊框?qū)⑥D(zhuǎn)變?yōu)辄S色以及當(dāng)鼠標(biāo)退出鼠標(biāo)區(qū)域的時(shí)候顏色恢復(fù)。在Button.qml里在 buttonClick()信號名稱前面加一個(gè)signal關(guān)鍵字來聲明。所有信號是它們自動創(chuàng)建的處理程序,它們的名稱以on開頭。像onButtonClick是按鈕單擊的事件處理。然后在onButtonClick內(nèi)指定執(zhí)行的動作。在我們按鈕的例子中,onClicked鼠標(biāo)處理程序只是簡單的調(diào)用
48、onButtonClick來顯示一個(gè)文本。onButtonClick啟用外面的對象來訪問該按鈕的鼠標(biāo)區(qū)域。例如項(xiàng)目可能聲明了多個(gè)MouseArea以及一個(gè)buttonClick信號可以使幾個(gè)MouseArea信號處理程序很好的區(qū)分。我們現(xiàn)在基本知道在QML里實(shí)現(xiàn)項(xiàng)目處理基本的鼠標(biāo)動作。我們在一個(gè)矩形內(nèi)部創(chuàng)建一個(gè)文本標(biāo)簽,自定義它的屬性以及實(shí)現(xiàn)響應(yīng)鼠標(biāo)動作的行為。這種在元素內(nèi)創(chuàng)建元素的想法是整個(gè)文本編輯器應(yīng)用程序中貫穿的。這個(gè)按鈕是沒有什么用的,除非作為一個(gè)組件來執(zhí)行一個(gè)動作。在下一節(jié)中,我們將創(chuàng)建一個(gè)菜單來包含幾個(gè)這樣的按鈕。語言島網(wǎng)站 19QML 雜記 Tonkv翻譯下面的代碼是我完善好的,
49、書的例子代碼并不完整。import Qt 4.7Rectangle id:buttonwidth: 150height: 75radius: 10border.width: 2property color buttonColor: lightblueproperty color onHoverColor: goldproperty color borderColor: whiteproperty string label:signal buttonClick()onButtonClick: console.log(buttonLabel.text + clicked )Textid: butt
50、onLabelanchors.centerIn: parenttext: labelMouseAreaid:buttonMouseAreaanchors.fill: parentonClicked: buttonClick()hoverEnabled: trueonEntered: parent.border.color = onHoverColoronExited: parent.border.color = borderColor/determines the color of the button by using the conditional operatorcolor: butto
51、nMouseArea.pressed ? Qt.darker(buttonColor, 1.5) : buttonColor創(chuàng)建一個(gè)菜單頁面到這一個(gè)階段,我們介紹了在一個(gè)QML文件中如何創(chuàng)建元素以及指定行為。在本節(jié)中,我們將介紹如何導(dǎo)入QML元素以及如何重新使用一些創(chuàng)建的組件來構(gòu)建其它的組件。菜單顯示了一個(gè)列表的內(nèi)容,每個(gè)項(xiàng)目有能力執(zhí)行一個(gè)動作。在QML里,我們有幾種方式來創(chuàng)建菜單。首先我們將創(chuàng)建一個(gè)菜單來包含幾個(gè)執(zhí)行不同動作的按鈕。該菜單代碼是FileMenu.qml文件里。import Qt 4.7 /import the main Qt QML moduleimport folderNa
52、me /import the contents of the folderimport script.js as Script /import a Javascript file and name it as Script語言島網(wǎng)站 20QML 雜記 Tonkv翻譯上面的語句顯示了如何使用impor t關(guān)鍵字。這里需要使用Ja vaScript文件或QML文件,這些文件沒有在同一目錄內(nèi)。Button.qml與FIleMenu.qml在同一目錄內(nèi),我們不需要導(dǎo)入Button.qml文件來使用它。我們可以直接通過聲明Button來直接創(chuàng)建一個(gè)按鈕。類似于Rectange那樣聲明。In FileMenu.qml:Rowanchors.centerIn: parentspacing: parent.width/6Buttonid: loadButtonbuttonColor: lightgreylabel: LoadButtonbuttonColor: greyid: saveButtonlabel: SaveButtonid: exitButtonlabel: ExitbuttonColor: darkgreyonButtonClick:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江經(jīng)濟(jì)職業(yè)技術(shù)學(xué)院《房地產(chǎn)市場理論與實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國礦業(yè)大學(xué)《中醫(yī)經(jīng)典綜合實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙大寧波理工學(xué)院《材料與成型》2023-2024學(xué)年第一學(xué)期期末試卷
- 棗莊職業(yè)學(xué)院《塑性加工力學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- DB2201T 70-2024 非洲豬瘟病毒環(huán)境監(jiān)測采樣技術(shù)規(guī)范
- 數(shù)學(xué)游戲演講模板
- 專業(yè)案例(暖通空調(diào)專業(yè))-公用設(shè)備工程師(暖通空調(diào)專業(yè))《專業(yè)案例》押題密卷
- 生命起源理論教學(xué)
- 七夕節(jié)青年?duì)I銷策略
- 二零二五版交通事故傷殘鑒定及賠償協(xié)議3篇
- 鋼結(jié)構(gòu)施工管理培訓(xùn)課件
- 2024年度工程建設(shè)項(xiàng)目安全評價(jià)合同2篇
- 《飛機(jī)操縱面》課件
- 商業(yè)咨詢報(bào)告范文大全
- 自我發(fā)展與團(tuán)隊(duì)管理課件
- 《婦產(chǎn)科學(xué)》課件-17.盆腔器官脫垂
- 監(jiān)理報(bào)告范本
- 店鋪交割合同范例
- 大型活動LED屏幕安全應(yīng)急預(yù)案
- 2024年內(nèi)蒙古包頭市中考道德與法治試卷
- 湖南省長沙市2024-2025學(xué)年高二上學(xué)期期中考試地理試卷(含答案)
評論
0/150
提交評論