用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里的圖標