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 中的with关键字使用详解
Sep 11 Python
详解Python多线程
Nov 14 Python
python 类详解及简单实例
Mar 24 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Python装饰器的执行过程实例分析
Jun 04 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 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面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
js 调用百度分享功能
2017/02/27 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
Python实现统计单词出现的个数
2015/05/28 Python
python获取代理IP的实例分享
2018/05/07 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
python对文件的操作方法汇总
2020/02/28 Python
人力资源管理专业学生自我评价
2013/11/20 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
教师业务学习材料
2014/12/16 职场文书
刑事案件上诉状
2015/05/23 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL