QML使用Python的函数过程解析


Posted in Python onSeptember 26, 2019

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

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

Python 相关文章推荐
Python上传package到Pypi(代码简单)
Feb 06 Python
Python的Django REST框架中的序列化及请求和返回
Apr 11 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
Python列表切片操作实例总结
Feb 19 Python
python实现诗歌游戏(类继承)
Feb 26 Python
如何基于python生成list的所有的子集
Nov 11 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
Django数据统计功能count()的使用
Nov 30 Python
Django中ORM的基本使用教程
Dec 22 Python
python urllib和urllib3知识点总结
Feb 08 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 #Python
python3多线程知识点总结
Sep 26 #Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 #Python
Python容器使用的5个技巧和2个误区总结
Sep 26 #Python
通过python3实现投票功能代码实例
Sep 26 #Python
Python编写打字训练小程序
Sep 26 #Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 #Python
You might like
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
使用python Django做网页
2013/11/04 Python
跟老齐学Python之Import 模块
2014/10/13 Python
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python base64编码解码实例
2015/06/21 Python
SVM基本概念及Python实现代码
2017/12/27 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Django框架models使用group by详解
2020/03/11 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
python实现飞船大战
2020/04/24 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
小学五一劳动节活动总结
2015/02/09 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
Python加密与解密模块hashlib与hmac
2022/06/05 Python