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 23 Python
python使用str & repr转换字符串
Oct 13 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
python实现自动登录
Sep 17 Python
Python3 max()函数基础用法
Feb 19 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
Python restful框架接口开发实现
Apr 13 Python
关于Numpy之repeat、tile的用法总结
Jun 02 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 has encountered an Access Violation
2007/01/15 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
javascript Keycode对照表
2009/10/24 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
js转html实体的方法
2016/09/27 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
Django之form组件自动校验数据实现
2020/01/14 Python
python如何调用百度识图api
2020/09/29 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
什么是属性访问器
2015/10/26 面试题
中学生获奖感言
2014/02/04 职场文书
家长对老师的评语
2014/04/18 职场文书
社区义诊活动总结
2014/04/30 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
董事长致辞
2015/07/29 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
mysql如何能有效防止删库跑路
2021/10/05 MySQL