PyQt/PySide6快速入門 - 3 QML簡介與Qt Creator開發(fā)環(huán)境

上一篇: PyQt/PySide6快速入門 - 2 使用QWidget設(shè)計(jì)GUI

QML簡介

QML(Qt Meta-Object Language羹膳,Qt元對(duì)象語言),Qt推出的Qt Quick技術(shù)的一部分步咪,是一種用于描述應(yīng)用程序用戶界面的聲明式編程語言。 它使用一些可視組件以及這些組件之間的交互來描述用戶界面扁凛。QML是一種高可讀性的語言躺屁,可以使組件以動(dòng)態(tài)方式進(jìn)行交互树姨,并且允許組件在用戶界面中很容易地實(shí)現(xiàn)復(fù)用和自定義。

image.png

QML是Qt Quick (Qt4.7.0+的新特性)核心組件之一:Qt Quick是一組旨在幫助開發(fā)者創(chuàng)建在手機(jī)闺兢、媒體播放器茂缚、機(jī)頂盒和其他便攜設(shè)備上使用越來越多的直觀、現(xiàn)代屋谭、流暢UI的工具集合脚囊。

如果學(xué)過前端開發(fā),會(huì)發(fā)現(xiàn)QML的思想跟Vue.js桐磁、Angula等非常相似悔耘。語法格式非常像HTML+CSS,也支持JavaScript形式的編程控制我擂。Qt Designer可以設(shè)計(jì)出.ui界面文件衬以,但是不支持和Qt原生C++代碼的交互。而Qt Creator可以設(shè)計(jì)出.qml文件校摩,QML可以和Qt原生代碼進(jìn)行交互看峻,作為MVC模型中的“View”。

國內(nèi)Vue.js很普及衙吩,后續(xù)會(huì)出一個(gè)完整的QML與Vue的功能對(duì)照表互妓,如:生命周期、Component、信號(hào)與Slot车猬、計(jì)算屬性、Transition動(dòng)畫尺锚、Repeater/V-for等珠闰。

MVC開發(fā)框架

MVC模式(Model–view–controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個(gè)基本部分:模型(Model)瘫辩、視圖(View)和控制器(Controller)伏嗜。

image.png

MVC模式最早由Trygve Reenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀(jì)80年代為程序語言Smalltalk發(fā)明的一種軟件架構(gòu)伐厌。MVC模式的目的是實(shí)現(xiàn)一種動(dòng)態(tài)的程式設(shè)計(jì)承绸,使后續(xù)對(duì)程序的修改和擴(kuò)展簡化,并且使程序某一部分的重復(fù)利用成為可能挣轨。除此之外军熏,此模式透過對(duì)復(fù)雜度的簡化,使程序結(jié)構(gòu)更加直觀及容易擴(kuò)展和維護(hù)卷扮。軟件系統(tǒng)透過對(duì)自身基本部分分離的同時(shí)也賦予了各個(gè)基本部分應(yīng)有的功能荡澎。專業(yè)人員可以依據(jù)自身的專長分組:

  • 模型(Model) - 程序員編寫程序應(yīng)有的功能(實(shí)現(xiàn)算法等等)、數(shù)據(jù)庫專家進(jìn)行數(shù)據(jù)管理和數(shù)據(jù)庫設(shè)計(jì)(可以實(shí)現(xiàn)具體的功能)晤锹。
  • 視圖(View) - 界面設(shè)計(jì)人員進(jìn)行圖形界面設(shè)計(jì)摩幔。
  • 控制器(Controller)- 負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求,對(duì)請(qǐng)求進(jìn)行處理鞭铆。

在Qt開發(fā)中或衡,QML就是作為View(+部分簡單的Model)模塊。而Python/C++則實(shí)現(xiàn)Controller+Model功能车遂。

QML開發(fā)環(huán)境

在安裝完P(guān)ython(> 3.6)封断、PySide6之后,其實(shí)就可以直接開發(fā)簡單的app了艰额。

pip install pyside6

當(dāng)然澄港,有可視化開發(fā)環(huán)境會(huì)事半功倍,界面開發(fā)可使用Qt Creator(注意跟Qt Designer不同柄沮,Designer只能設(shè)計(jì).ui文件)回梧,Python調(diào)試則使用PyCharm。

Qt Creator有社區(qū)版本祖搓,Windows下安裝步驟:

  1. 下載Qt在線安裝程序: qt official_releases/online_installers (qt.io)

  2. 注冊(cè)一個(gè)Qt賬號(hào)

  3. 運(yùn)行qt-unified-windows-x86-4.3.0-1-online.exe

  4. 選擇自定義安裝Custom installation

image.png
  1. 組件選擇:(這里選擇錯(cuò)了也沒關(guān)系狱意,安裝后可以在程序里找“Qt Maintenance Tool”重新增減組件)
  • Qt 6.3.0 MinGW,用于直接調(diào)試C++和 .qml文件
  • 如果你用MS VS的話拯欧,可選擇MSVC 2019
  • Qt Creator 7.0.2和相應(yīng)debug模塊


    image.png

耐心等待安裝完成详囤,大概下載700MB,安裝后占用約4GB空間。

在開始菜單里找到Qt Creator藏姐,運(yùn)行:


image.png

注意:Qt現(xiàn)在推廣Qt Design Studio隆箩,所以把Qt Creator里可視化編輯QML的工具給隱藏了,要自行打開:菜單Help --> About Plugins... --> 勾選Designer羔杨,重啟程序捌臊。

image.png

第一個(gè)Py QML程序

Qt Creator: File --> New Project...

  1. 這里有很多模板,第一種“Application (Qt)”兜材,適合C++開發(fā)理澎。第二種"Application (Qt for Python)"就是適合Python(PySide6/PyQt)開發(fā)的。
  2. 第二列曙寡,選擇“Qt Quick Application"糠爬,使用QML開發(fā),點(diǎn)下一步
  3. 選擇最新的PySide6举庶,點(diǎn)完成

會(huì)自動(dòng)按模板創(chuàng)建3個(gè)文件:

pyqml.pyproject

{
    "files": ["main.py", "main.qml"]
}

main.py

import os
from pathlib import Path
import sys

from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine

if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.load(os.fspath(Path(__file__).resolve().parent / "main.qml"))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

這個(gè)Python主程序非常簡潔:

  • 引用PySide6执隧。如果是使用PyQt,則直接修改為PyQt6就行
  • 創(chuàng)建Qt主程序:app = QGuiApplication(sys.argv)
  • 創(chuàng)建解析QML的引擎: engine = QQmlApplicationEngine()
  • engine加載QML文件: engine.load("main.qml")
  • app就可以直接運(yùn)行了

main.qml

import QtQuick
import QtQuick.Window

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
}

這個(gè)QML主界面灯变,內(nèi)容也非常一目了然:

  • 創(chuàng)建一個(gè)Window組件
  • 設(shè)置它的屬性:width, height, visible, title殴玛。相比.ui文件,是不是簡潔方便多了添祸?
  • 用鼠標(biāo)點(diǎn)擊.qml里字段滚粟,如Window,按"F1"刃泌,可以直接查詢對(duì)應(yīng)的幫助文檔

如何運(yùn)行

左邊一列工具欄里凡壤,先點(diǎn)擊“Project",選擇Python解釋器(注意確保PySide6已安裝)

image.png

點(diǎn)工具欄左下角綠色運(yùn)行鍵耙替,第一個(gè)Py QML程序就順利運(yùn)行了:

  • 注意Applicationi Output里亚侠,可以查看調(diào)試信息
image.png

如果是復(fù)雜的Python程序,可以在PyCharm中打開這個(gè)目錄俗扇,方便調(diào)試 .py文件硝烂。

點(diǎn)工具欄"Edit",可以編輯源文件铜幽,雙擊“main.qml“滞谢,這時(shí)工具欄 "Design" 就變亮了。

點(diǎn)工具欄"Design"除抛,右上角可選顯示方式狮杨,一般使用"Essentials" 或 "UX-Design"。

image.png

可視化編輯UI (.qml文件)

左邊"Components"點(diǎn) "+"到忽,添加"QtQuick.Controls橄教,Layouts"等顯示到常用組件


image.png

我們來隨便試試吧:

拖一個(gè)"Text"、一個(gè)"Button"組件到中間"Form Editor",app主界面上护蝶。右邊的"Text Editor"上會(huì)自動(dòng)更新.qml文件华烟。同理,你在外部改動(dòng) .qml文件后持灰,預(yù)覽也會(huì)自動(dòng)更新垦江。語法跟CSS類似。

給"Button"添加一個(gè)onClicked事件搅方,可以看到就是JavaScript語法,實(shí)際上绽族,你可以在QML文件里直接寫任意js代碼并調(diào)用姨涡。當(dāng)然,Controller控制功能還是建議與View分開吧慢。

image.png

保存.qml涛漂,再次運(yùn)行,可以看到界面已經(jīng)能響應(yīng)Button點(diǎn)擊了检诗,同時(shí)console.log信息也輸出“Application Output”了匈仗。

是不是有回到Vue.js寫前端的熟悉感覺了哈?

小貼士:

QML程序在PyCharm里調(diào)試逢慌,看不到console.log輸出怎么辦悠轩?

  • Pycharm打開app目錄
  • 運(yùn)行main.py
  • 右上角點(diǎn)箭頭:Edit Configurations...
  • Execution: 勾選Emulate terminal in output console
image.png
  • 這樣,python輸出和QML輸出的信息就能同時(shí)看到了:
C:\Users\kevinqq\AppData\Local\Programs\Python\Python38\python.exe C:/Users/kevinqq/git/qtProject/pyqml/main.py
<PySide6.QtGui.QWindow(0x22fe7329) at 0x0000022F>
qml: button clicked
qml: button clicked

Process finished with exit code 0

下一篇攻泼,使用QML來改寫第2篇的天氣預(yù)報(bào)程序火架,涉及信號(hào)、動(dòng)畫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忙菠,一起剝皮案震驚了整個(gè)濱河市何鸡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牛欢,老刑警劉巖骡男,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麸折,死亡現(xiàn)場(chǎng)離奇詭異坦仍,居然都是意外死亡欢嘿,警方通過查閱死者的電腦和手機(jī)鲁冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門驾孔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稽鞭,“玉大人诵闭,你說我怎么就攤上這事采蚀⌒芾担” “怎么了来屠?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我俱笛,道長捆姜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任迎膜,我火速辦了婚禮泥技,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磕仅。我一直安慰自己珊豹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布榕订。 她就那樣靜靜地躺著店茶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劫恒。 梳的紋絲不亂的頭發(fā)上贩幻,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音两嘴,去河邊找鬼丛楚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憔辫,可吹牛的內(nèi)容都是我干的趣些。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼贰您,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼喧务!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枉圃,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤功茴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后孽亲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坎穿,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年返劲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玲昧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篮绿,死狀恐怖孵延,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亲配,我是刑警寧澤尘应,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布惶凝,位于F島的核電站,受9級(jí)特大地震影響犬钢,放射性物質(zhì)發(fā)生泄漏苍鲜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一玷犹、第九天 我趴在偏房一處隱蔽的房頂上張望混滔。 院中可真熱鬧,春花似錦歹颓、人聲如沸坯屿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿伴。三九已至,卻和暖如春电湘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹅经。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工寂呛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘾晃。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓贷痪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹦误。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劫拢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

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