QML使用Python的函數


有2種方法:

一、 QML中定義一個信號,連接Python里的函數;

這里的函數不用特意指明為槽函數,普通函數即可。

QML的信號連接Python的函數

QML:
首先在QML中定義一個信號,這里的信號傳遞一個字符串給函數(信號可帶參數也可不帶):

signal mySignal(string my_string)

然后在click中發射這個信號:

onClicked:{
    root.mySignal("hello world")
}

Python:
使用QML里的信號連接Python里的函數:

engine.rootObjects()[0].mySignal.connect(my_func)  # 這里的mySignal是在QML里定義的

完整代碼:
QML:

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    id: root
    width: 250
    height: 500
    visible: true signal mySignal(string my_string)

    MouseArea {
        id: mouse_area
        anchors.fill: parent
        onClicked: {
            root.mySignal("hello world")
        }
    }
}

Python:

from PyQt5.QtCore import QObject
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
import sys


class MyWindow(QObject):
    def __init__(self):
        super().__init__()
        self.engine = QQmlApplicationEngine()
        self.engine.load('qml-test.qml')

        # root signal
        my_obj = self.engine.rootObjects()[0]
        my_obj.mySignal.connect(self.my_func)

    def my_func(self, my_string):
        print(my_string)


if __name__ == '__main__':
    app = QGuiApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec())

 

二、 Python中定義一個類及槽函數,在QML中使用這個槽函數。

在QML中調用Python中的槽函數

首先需要在Python里定義一個類,在類里寫一個槽函數:

 

 class Person(QObject):
    def __init__(self):
        super().__init__()

    @pyqtSlot() # 注意是槽函數!
    def begin(self):
        print('begin')

 

然后通過setContextProperty將這個類設置為上下文的一個屬性值:

person = Person()
engine.rootContext().setContextProperty('person', person)

QML文件里不需特別設置,直接調用函數即可。

完整代碼:

Python:

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSlot
import sys


class Person(QObject):
    def __init__(self):
        super().__init__()

    @pyqtSlot()  # 注意是槽函數!
    def begin(self):
        print('begin')


if __name__ == '__main__':
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    person = Person()
    engine.rootContext().setContextProperty('person', person)

    engine.load('qml-test.qml')
    sys.exit(app.exec())

QML:

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    id: root
    width: 250
    height: 500
    visible: true

    Button{
            text:qsTr("begin")
            onClicked: {
                person.begin()
            }
    }
}

 

-- END --

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM