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简单实现旋转图片的方法
May 30 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
Python定时器实例代码
Nov 01 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
Python如何执行系统命令
Sep 23 Python
对Pytorch 中的contiguous理解说明
Mar 03 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
坏狼php学习 计数器实例代码
2008/06/15 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
ptyhon实现sitemap生成示例
2014/03/30 Python
Python中的yield浅析
2014/06/16 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
python 实现让字典的value 成为列表
2019/12/16 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
计算机开发个人求职信范文
2013/09/26 职场文书
面试感谢信范文
2015/01/22 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
赢在执行观后感
2015/06/16 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
mysql sock文件存储了什么信息
2022/07/15 MySQL