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

最新文章

  1. python迭代器实现斐波拉契求值
  2. asp.net正则模板引擎代码
  3. Android爬坑之旅:软键盘挡住输入框问题的终极解决方案
  4. iOS自动布局一
  5. MongoDB(3):小的细节问题
  6. Python核心编程--学习笔记--4--Python对象
  7. ARM处理机模式--内部寄存器
  8. web开发工具IDE
  9. 杭电oj 1328
  10. 查看linux信息
  11. 1034. Head of a Gang
  12. 如何有效的跟踪线上 MySQL 实例表和权限的变更
  13. 使用TensorFlow创建第变量定义和运行方式
  14. grub rescue 主引导修复
  15. day 23-1 类的命名空间、组合
  16. vue路由复用
  17. Nginx 如何处理上游响应的数据
  18. BizTalk RosettaNet 开发笔记
  19. easyui layout布局的属性说明
  20. java 读取本地的json文件

热门文章

  1. K-D树
  2. centos6.5安装pip方法
  3. Linux-删除文件空间不释放问题解决
  4. js中当call或者apply传入的第一个参数是null/undefined时,js函数内执行的上下文环境是什么?
  5. centos 7.3 开放端口并对外开放
  6. [Google Guava] 10-散列
  7. Python 11--文件流
  8. mouseover([[data],fn])
  9. 查看文件被哪个进程lock住
  10. learning express step(七)