Qt小知識(shí) | 用一篇小短文憨降,帶你進(jìn)入 QML 的美妙世界

大家好父虑,我是老吳。

今天用幾個(gè)小例子帶大家快速入門 QML 編程授药。

0. 什么是 QML士嚎?

QML 是一種用于描述應(yīng)用程序用戶界面的聲明式編程語言,Qt Quick 則是 QML 應(yīng)用的標(biāo)準(zhǔn)庫悔叽。

我為什么選擇學(xué)習(xí) QML莱衩?

易上手;

可讀性高;

學(xué)習(xí)資料多,有各種文檔和示例;

跨平臺(tái);

性能不差骄蝇,流暢度還行膳殷。

1. 如何創(chuàng)建 QML 應(yīng)用?

舉個(gè)栗子:

在 Qt Creator 依次點(diǎn)擊:

-> File -> New File or Project

-> Applications -> Qt Quick Application

然后一路點(diǎn)擊 next 直到 finish 九火。

修改 main.qml :

//?文件?main.qml

import?QtQuick?2.12
import?QtQuick.Window?2.12

Window?{
????visible:?true
????width:?320
????height:?240
????title:?qsTr("Hello?World")

????Rectangle?{
????????width:?320
????????height:?240
????????color:?"green"

????????Text?{
????????????anchors.centerIn:?parent
????????????text:?"Hello,?World!"
????????}
????}
}

這樣就完成了你的第一個(gè) QML 程序赚窃,它的作用是在一個(gè)綠色的長(zhǎng)方形塊上顯示 "Hello World!"。

運(yùn)行效果:

這里的 Window岔激、Rectangle勒极、Text 都是 QML 里的類型,術(shù)語 為 QML Type虑鼎。

進(jìn)一步了解 QML Type:

The QML Type System

QML Basic Types

QML Object Types

2. 使用 Qt Quick Controls

什么是 Qt Quick Controls辱匿?

Qt Quick Controls 就是一組控件,用于在 Qt Quick 中構(gòu)建完整的界面炫彩。

舉個(gè)例子:

//?文件?main.qml

import?QtQuick?2.12
import?QtQuick.Controls?2.12

ApplicationWindow?{
????visible:?true
????title:?qsTr("Hello?World")
????width:?320
????height:?240

????menuBar:?MenuBar?{
????????Menu?{
????????????title:?qsTr("File")
????????????MenuItem?{
????????????????text:?qsTr("&Open")
????????????????onTriggered:?console.log("Open?action?triggered");
????????????}
????????????MenuItem?{
????????????????text:?qsTr("Exit")
????????????????onTriggered:?Qt.quit();
????????????}
????????}
????}

????Button?{
????????text:?qsTr("Hello?World")
????????anchors.horizontalCenter:?parent.horizontalCenter
????????anchors.verticalCenter:?parent.verticalCenter
????}
}

這里的 ApplicationWindow 匾七、MenuBar、Button 首先是 QML Type江兢,并且它們是 Qt Quick Controls 里提供的控件昨忆。

  • ApplicationWindow 是一個(gè)通用的窗口控件;

  • MenuBar 是一個(gè)菜單欄控件;

  • Button 是按鍵控件;

運(yùn)行效果:

進(jìn)一步了解 Qt Quick Controls:

Qt Quick Layouts - Basic Example

Qt Quick Controls - Gallery

3. 處理用戶輸入

使用 QML 設(shè)計(jì)界面的一大優(yōu)點(diǎn)是,

它允許設(shè)計(jì)人員使用簡(jiǎn)單的 JavaScript 表達(dá)式定義應(yīng)用程序?qū)κ录姆磻?yīng)杉允。

在 QML 中邑贴,我們將事件稱為信號(hào),并且這些信號(hào)由信號(hào)處理程序處理叔磷。

舉個(gè)例子:

//?文件?main.qml

ApplicationWindow?{
????...

????Rectangle?{
????????width:?100
????????height:?100
????????color:?"red"
????????anchors.verticalCenter:?parent.verticalCenter

????????Text?{
????????????anchors.centerIn:?parent
????????????text:?"Hello,?World!"
????????}

????????TapHandler?{
????????????onTapped:?parent.color?=?"green"
????????}
????}
}

運(yùn)行效果:

TapHandler 用于響應(yīng)觸摸屏或者鼠標(biāo)的點(diǎn)擊拢驾,這里我們使用它來處理對(duì)綠色方塊的點(diǎn)擊事件。

進(jìn)一步了事件處理:

Signal and Handler Event System

4. 屬性綁定

什么是屬性綁定改基?

對(duì)象及其屬性構(gòu)成了 QML 文件中定義的圖形界面的基礎(chǔ)繁疤。

QML 允許屬性彼此之間以各種方式綁定,從而實(shí)現(xiàn)高度動(dòng)態(tài)的用戶界面。

舉個(gè)例子:

//?文件?main.qml

ApplicationWindow?{
????Rectangle?{
????????width:?100
????????height:?100
????????color:?"red"

????????Rectangle?{
????????????width:?parent.width?/?2
????????????height:?parent.height?/?2
????????????color:?"green"
????????}
????}
}

運(yùn)行效果:

子矩形的長(zhǎng)寬綁定了到父矩形的幾何形狀嵌洼。

如果父矩形的長(zhǎng)寬發(fā)生變化案疲,則由于屬性綁定,子矩形的長(zhǎng)寬將自動(dòng)更新麻养。

5. 自定義 QML Type

每個(gè) QML 文件都隱式地定義了一個(gè) QML type,這個(gè) QML type 可以在其他 QML 文件中重復(fù)使用诺舔。

舉個(gè)例子:

新建一個(gè) QML 文件 MessageLabel.qml:

//?文件?MessageLabel.qml
import?QtQuick?2.12

Rectangle?{
????height:?50
????property?string?message:?"debug?message"
????property?var?msgType:?["debug",?"warning"?,?"critical"]
????color:?"black"

????Column?{
????????anchors.fill:?parent
????????padding:?5.0
????????spacing:?2

????????Text?{
????????????text:?msgType.toString().toUpperCase()?+?":"
????????????font.bold:?msgType?==?"critical"
????????????font.family:?"Terminal?Regular"
????????????color:?msgType?===?"warning"?||?msgType?===?"critical"???"red"?:?"yellow"
????????????ColorAnimation?on?color?{
????????????????running:?msgType?==?"critical"
????????????????from:?"red"
????????????????to:?"black"
????????????????duration:?1000
????????????????loops:?msgType?==?"critical"???Animation.Infinite?:?1
????????????}
????????}

????????Text?{
????????????text:?message
????????????color:?msgType?===?"warning"?||?msgType?===?"critical"???"red"?:?"yellow"
????????????font.family:?"Terminal?Regular"
????????}
????}

}

這里可以理解為我們創(chuàng)建了一個(gè)名為 MessageLabel 的控件鳖昌。

引用 MessageLabel:

//?文件?main.qml
Window?{
????...
????
????Column?{
????????...

????????MessageLabel{
????????????width:?parent.width?-?2
????????????msgType:?"debug"
????????}
????????MessageLabel?{
????????????width:?parent.width?-?2
????????????message:?"This?is?a?warning!"
????????????msgType:?"warning"
????????}
????????MessageLabel?{
????????????width:?parent.width?-?2
????????????message:?"A?critical?warning!"
????????????msgType:?"critical"
????????}
????}
}

運(yùn)行效果:

我們很方便地就構(gòu)造了一個(gè)名為 MessageLabel 的控件,用于實(shí)現(xiàn)不同等級(jí)的 log 打印低飒。

到這里许昨,相信你已經(jīng)進(jìn)入了 QML 編程的世界了,請(qǐng)開始你自己的探索之旅吧褥赊。

—— The End ——

推薦閱讀:

專輯 | Linux 驅(qū)動(dòng)開發(fā)

專輯 | Linux 系統(tǒng)編程

專輯 | 每天一點(diǎn) C

專輯 | Qt 入門

想進(jìn)交流群糕档?

后臺(tái)回復(fù)【加群】,我拉你進(jìn)群拌喉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末速那,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尿背,更是在濱河造成了極大的恐慌端仰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件田藐,死亡現(xiàn)場(chǎng)離奇詭異荔烧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汽久,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鹤竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人景醇,你說我怎么就攤上這事臀稚。” “怎么了啡直?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵烁涌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我酒觅,道長(zhǎng)撮执,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任舷丹,我火速辦了婚禮抒钱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己谋币,他們只是感情好仗扬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕾额,像睡著了一般早芭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诅蝶,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天退个,我揣著相機(jī)與錄音,去河邊找鬼调炬。 笑死语盈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缰泡。 我是一名探鬼主播刀荒,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼棘钞!你這毒婦竟也來了缠借?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤武翎,失蹤者是張志新(化名)和其女友劉穎烈炭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宝恶,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡符隙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垫毙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹疫。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖综芥,靈堂內(nèi)的尸體忽然破棺而出丽蝎,到底是詐尸還是另有隱情,我是刑警寧澤膀藐,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布屠阻,位于F島的核電站,受9級(jí)特大地震影響额各,放射性物質(zhì)發(fā)生泄漏国觉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一虾啦、第九天 我趴在偏房一處隱蔽的房頂上張望麻诀。 院中可真熱鬧痕寓,春花似錦、人聲如沸蝇闭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呻引。三九已至礼仗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逻悠,已是汗流浹背藐守。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹂风,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓乾蓬,卻偏偏與公主長(zhǎng)得像惠啄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子任内,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容