QML使用Python的函数

枫铃3年前 (2021-07-09)Python238

有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
       >: {
            root.mySignal("hello world")
        }
    }
}

Python:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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")
           >: {
                person.begin()
            }
    }
}

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。