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中的RSS处理
Apr 13 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 Python
浅谈Python traceback的优雅处理
Aug 31 Python
python pandas库的安装和创建
Jan 10 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
Django中ORM外键和表的关系详解
May 20 Python
Python 串口读写的实现方法
Jun 12 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
python 模拟贷款卡号生成规则过程解析
Aug 30 Python
python与idea的集成的实现
Nov 20 Python
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 Python
浅谈Python数学建模之线性规划
Jun 23 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
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
Vue中封装input组件的实例详解
2017/10/17 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
Vue 实现简易多行滚动"弹幕"效果
2020/01/02 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
python实现电子书翻页小程序
2019/07/23 Python
python实现PCA降维的示例详解
2020/02/24 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
教师自荐书
2013/10/08 职场文书
营业员演讲稿
2013/12/30 职场文书
给校长的一封检讨书
2014/09/20 职场文书
甲午风云观后感
2015/06/02 职场文书
行政处罚决定书
2015/06/24 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
Golang 切片(Slice)实现增删改查
2022/04/22 Golang