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之模块的加载
Oct 24 Python
python实现的系统实用log类实例
Jun 30 Python
详谈python read readline readlines的区别
Sep 22 Python
python交互式图形编程实例(二)
Nov 17 Python
Linux CentOS7下安装python3 的方法
Jan 21 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
python学生管理系统代码实现
Apr 05 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
python读取pdf格式文档的实现代码
Apr 01 Python
Python基础详解之描述符
Apr 28 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与XML的PDF文档生成技术
2006/10/09 PHP
PHP 字符串 小常识
2009/06/05 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
pycharm修改file type方式
2019/11/19 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
is_file和file_exists效率比较
2021/03/14 PHP
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
毕业生自荐书
2014/02/03 职场文书
期中考试后的感想
2015/08/07 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python