PyQt5

用QML渲染界面

第一種: 通過QQickView

app = QGuiApplication([])
view = QQuickView()
view.engine().quit.connect(app.quit)
view.setSource(QUrl('main.qml'))
view.show()
sys.exit(app.exec_())

注意: QQickView的main.qml根節(jié)點不能是ApplicationWindow, 只能是Item類型

第二種: 通過QQmlApplicationEngine

# Create an instance of the application
app = QGuiApplication(sys.argv)
# Create QML engine
engine = QQmlApplicationEngine()
engine.addImportPath(":/qtquickcontrols2.conf") #可選惊楼,是設置Material主題
# Load the qml file into the engine
engine.load(QUrl("main.qml"))
# engine.quit.connect(app.quit)
sys.exit(app.exec_())

注意: QQmlApplicationEngine的main.qml根節(jié)點只能是ApplicationWindow

加載Material主題

步驟:

  • 創(chuàng)建一個主題配置文件qtquickcontrols2.conf, 內(nèi)容如下:
; This file can be edited to change the style of the application
; Read "Qt Quick Controls 2 Configuration File" for details:
; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html

[Controls]
Style=Material

[Universal]
Theme=Light
;Accent=Steel

[Material]
Theme=Dark
;Accent=BlueGrey
;Primary=BlueGray
;Foreground=Brown
;Background=Grey
  • 創(chuàng)建一個資源文件qml.qrc, 內(nèi)容如下:
<RCC>
    <qresource prefix="/">
        <file>qtquickcontrols2.conf</file>
    </qresource>
</RCC>
  • 把qml.qrc編譯成py文件, 代碼如下:
pyrcc5 -o qrc.py qml.qrc
  • 在啟動QQmlApplicationEngine前引入qrc.py, 代碼如下:
import qrc
  • 通過Qt Resource添加方式引入qtquickcontrols2.conf, 代碼如下:
engine.addImportPath(":/qtquickcontrols2.conf")
  • 然后就可以在main.qml里使用Material主題了
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.2
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.11

ApplicationWindow {
    id: window
    width: 850
    height: 600
    opacity: 1
    visible: true
    Material.theme: Material.Dark
    Material.accent: Material.LightBlue
}

控制臺信息打印到GUI

只需要把sys.stdout和sys.stderr重定向到新對象即可

  • 創(chuàng)建一個繼承QObject的對象
  • 重載write和flush方法
  • 當有打印信息輸出時會調(diào)用write诚些,如需要發(fā)送到GUI, 則添加一個信號槽機制即可
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
class QmlWorker(QObject):
    consoleInfo = pyqtSignal(str)

    def write(self, text):
        self.consoleInfo.emit(text.strip())

    def flush(self):
        pass

qml添加全局對象, 并實現(xiàn)信號槽 + 屬性調(diào)用

  • 創(chuàng)建一個繼承QObject的對象
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
class QmlWorker(QObject):
    consoleInfo = pyqtSignal(str)
    ipChanged = pyqtSignal()

    def write(self, text):
        self.consoleInfo.emit(text.strip())

    def flush(self):
        pass

    @pyqtProperty(str, notify=ipChanged)
    def ip(self):
        return self.conf['ip']

    @ip.setter
    def ip(self, ip):
        self.conf['ip'] = ip

    @pyqtSlot()
    def run(self):
        print(self.conf)
        p = Thread(target=self.run_ui_process, kwargs=self.conf)
        p.start()
  • 在啟動main函數(shù)里添加全局對象
qml_worker = QmlWorker()
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("qmlworker", qml_worker)
  • 在qml文件里添加連接全局對象節(jié)點
Connections {
        target: qmlworker
        onConsoleInfo: {
            var text = arguments[0]
            if (text === null || text === '') {
                return
            }
            textArea.append(text)
        }
    }
  • qml里調(diào)用全局對象的函數(shù)
qmlworker.run()
  • qml里訪問全局對象屬性并賦值
// 訪問對象IP屬性
TextField {
    id: ipTextField
    text: qmlworker.ip
    ...
}
//給IP賦值
qmlworker.ip = 127.0.0.1

添加Font Awesome圖標庫

  • 仿照上面“加載Material主題”模塊

資源文件均可以采用該方法添加到pyqt

  • 在啟動main函數(shù)里添加如下內(nèi)容
app = QGuiApplication(sys.argv)
loadedFontID = QFontDatabase.addApplicationFont(":font/Font_Awesome.otf")

loadedFontFamilies = QFontDatabase.applicationFontFamilies(loadedFontID)
if len(loadedFontFamilies) != 0:
     logger.info('font name:' + loadedFontFamilies[0])

Font_Awesome.otf 是Awesome官網(wǎng)下載的圖標庫

  • 在qml里使用圖標庫
Button {
        id: execBtn
       text: "\uf0e7 執(zhí)行"
       font.family: "Font Awesome 5 Free Solid"
       ...
}

\uf0e7就是Awesome里的圖標

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔓彩,隨后出現(xiàn)的幾起案子弓叛,更是在濱河造成了極大的恐慌,老刑警劉巖蒜焊,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件停做,死亡現(xiàn)場離奇詭異,居然都是意外死亡衷敌,警方通過查閱死者的電腦和手機勿侯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逢享,“玉大人,你說我怎么就攤上這事吴藻÷髋溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵沟堡,是天一觀的道長侧但。 經(jīng)常有香客問我,道長航罗,這世上最難降的妖魔是什么禀横? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮粥血,結果婚禮上柏锄,老公的妹妹穿的比我還像新娘酿箭。我一直安慰自己,他們只是感情好趾娃,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布缭嫡。 她就那樣靜靜地躺著,像睡著了一般抬闷。 火紅的嫁衣襯著肌膚如雪妇蛀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天笤成,我揣著相機與錄音评架,去河邊找鬼。 笑死炕泳,一個胖子當著我的面吹牛纵诞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喊崖,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼挣磨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荤懂?” 一聲冷哼從身側響起茁裙,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎节仿,沒想到半個月后晤锥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡廊宪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年矾瘾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箭启。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡壕翩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傅寡,到底是詐尸還是另有隱情放妈,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布荐操,位于F島的核電站芜抒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏托启。R本人自食惡果不足惜宅倒,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屯耸。 院中可真熱鬧拐迁,春花似錦蹭劈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至灶搜,卻和暖如春祟蚀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背割卖。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工前酿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹏溯。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓罢维,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丙挽。 傳聞我的和親對象是個殘疾皇子肺孵,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,178評論 25 707
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料颜阐? 從這篇文章中你...
    hw1212閱讀 12,732評論 2 59
  • 三天假這么快就過去了平窘,今天陽光明媚,兒子上午去同學家凳怨,下午有課瑰艘,沒到戶外,本想下課去哪兒耍耍肤舞,無奈他有個永遠把運動...
    misang閱讀 1,406評論 1 6
  • 都說人和人相識是緣分紫新,殊不知,我也這樣邂逅了簡書李剖! 許久不逛朋友圈的我芒率,今早偷懶不想起,又閑的無聊就開始批...
    絲舞風迎閱讀 214評論 0 0
  • 文/墨染 在每個人的內(nèi)心世界里篙顺,都有一盞屬于自己的燈偶芍。時而明凈,時而暗淡慰安,時而恍惚腋寨。當油盡燈枯的時候聪铺,自己的...
    __墨染閱讀 339評論 5 9