qml调用python_QML使用Python的函数过程解析

本文介绍两种QML与Python进行交互的方法:一是通过在QML中定义信号并连接到Python函数;二是通过在Python中定义类及槽函数,并在QML中调用这些槽函数。

有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()

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-09-26

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值