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正则表达式匹配HTML页面编码
Apr 08 Python
使用Python中的cookielib模拟登录网站
Apr 09 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
python中的单引号双引号区别知识点总结
Jun 23 Python
使用python+whoosh实现全文检索
Dec 09 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python 实现的截屏工具
May 08 Python
Python selenium模拟网页点击爬虫交管12123违章数据
May 26 Python
教你用Python爬取英雄联盟皮肤原画
Jun 13 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
第二节 对象模型 [2]
2006/10/09 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
js 表格隔行颜色
2009/12/02 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
React路由鉴权的实现方法
2019/09/05 Javascript
JS实现简单日历特效
2020/01/03 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
人事行政主管岗位职责
2013/12/22 职场文书
保密工作实施方案
2014/02/24 职场文书
数学检讨书1000字
2014/02/24 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
升职感谢信
2015/01/22 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
新店开张宣传语
2015/07/13 职场文书
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python