python qt信号在qml 的使用_QML与Python通信

对于Python3和QML通信,实际上就是 PyQt5+QML+Python3混合编程,这是必须的,因为QML做图形界面比较容易,但是做功能实现就用Python比较好,虽然QML也能嵌入 JavaScript代码进行实现,但是这样话还不如用Python来实现,代码简洁、易懂。

对于以下的例子,参考了如下的连接:

Connecting QML signals in PySide:

PyQt 5.1.1 Reference Guide -> Support for Signals and Slots:

(1)QML显式的调用Python函数

定义一个类,并继承QtCore.QObject对象,并使用@修饰符修饰pyqtSlot

1

2

3

4

5

6

7

8

9

class MyClass(QObject):

@pyqtSlot(str)    # 传递参数类型字符串

def outputString(self, string):

"""

功能: 创建一个槽

参数: 输出的数据string

返回值: 无

"""

print(string)

创建rootContext对象,并使用setContextProperty(string, object)注册对象,这样在QML中就可以调用这个函数了。

1

2

context = view.rootContext()

context.setContextProperty("con", con)

如下是一个完整的例子:

这个例子运行后,如果点击鼠标的话,会在控制台打印字符串。

Python3代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

# -*- coding: GBK -*-

from PyQt5.QtCore import QUrl, QObject, pyqtSlot

from PyQt5.QtGui import QGuiApplication

from PyQt5.QtQuick import QQuickView

class MyClass(QObject):

@pyqtSlot(str)    # 输入参数为str类型

def outputString(self, string):

"""

功能: 创建一个槽

参数: 输出的数据string

返回值: 无

"""

print(string)

if __name__ == '__main__':

path = 'test.qml'   # 加载的QML文件

app = QGuiApplication([])

view = QQuickView()

con = MyClass()

context = view.rootContext()

context.setContextProperty("con", con)

view.engine().quit.connect(app.quit)

view.setSource(QUrl(path))

view.show()

app.exec_()

QML代码(文件名保存为test.qml):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import QtQuick 2.0

Rectangle {

width: 320; height: 240

color: "lightgray"

Text {

id: txt

text: "Clicked me"

font.pixelSize: 20

anchors.centerIn: parent

}

MouseArea {

id: mouse_area

anchors.fill: parent  // 有效区域

onClicked: {

con.outputString("Hello, Python3")

}

}

}

运行结果如下:

(2)QML调用Python函数,并返回

这个例子跟上一个相类似,只是这次调用Python的函数具有返回值功能。

以下是一个完整的例子:

运行程序后,点击鼠标,左上角会显示数字30。

Python3代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

# -*- coding: GBK -*-

from PyQt5.QtCore import QUrl, QObject, pyqtSlot

from PyQt5.QtGui import QGuiApplication

from PyQt5.QtQuick import QQuickView

class MyClass(QObject):

@pyqtSlot(int, result=str)    # 声明为槽,输入参数为int类型,返回值为str类型

def returnValue(self, value):

"""

功能: 创建一个槽

参数: 整数value

返回值: 字符串

"""

return str(value+10)

if __name__ == '__main__':

path = 'test.qml'   # 加载的QML文件

app = QGuiApplication([])

view = QQuickView()

con = MyClass()

context = view.rootContext()

context.setContextProperty("con", con)

view.engine().quit.connect(app.quit)

view.setSource(QUrl(path))

view.show()

app.exec_()

QML代码(文件名保存为test.qml):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import QtQuick 2.0

Rectangle {

id: root

width: 320; height: 240

color: "lightgray"

Text {

id: txt

text: "Clicked me"

font.pixelSize: 20

anchors.centerIn: parent

}

Text {

id: txt1

text: "..."

font.pixelSize: 20

}

MouseArea {

id: mouse_area

anchors.fill: parent  // 有效区域

onClicked: {

console.log("test...")  // 控制台打印信息

txt1.text = con.returnValue(20)

}

}

}

运行效果如下:

未点击鼠标时:                                                              点击鼠标之后:

(3)QML连接信号到Python

当QML触发事件的时候,发射一个信号给Python,此时Python调用一个函数。

先在QML中定义一个信号,

1

signal sendClicked(string str) // 定义信号

然后在捕获事件的时候,发射信号,

1

2

3

4

5

6

7

MouseArea {

id: mouse_area

anchors.fill: parent  // 有效区域

onClicked: {

root.sendClicked("Hello, Python3")    # 发射信号到Python

}

}

最后Python中创建一个rootObject对象,然后连接这个对象,

1

2

3

4

5

6

7

def outputString(string):

"""

功能: 输出字符串

参数: 输出的数据string

返回值: 无

"""

print(string)

1

2

context = view.rootObject()

context.sendClicked.connect(outputString)   # 连接QML信号sendCLicked

以下是一个完整的例子:

这个例子中,当点击鼠标的时候,控制台会打印信息。

Python3代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

# -*- coding: GBK -*-

from PyQt5.QtCore import QUrl, pyqtSlot

from PyQt5.QtGui import QGuiApplication

from PyQt5.QtQuick import QQuickView

def outputString(string):

"""

功能: 输出字符串

参数: 输出的数据string

返回值: 无

"""

print(string)

if __name__ == '__main__':

path = 'test.qml'   # 加载的QML文件

app = QGuiApplication([])

view = QQuickView()

view.engine().quit.connect(app.quit)

view.setSource(QUrl(path))

view.show()

context = view.rootObject()

context.sendClicked.connect(outputString)   # 连接QML信号sendCLicked

app.exec_()

QML代码(文件名保存为test.qml):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

import QtQuick 2.0

Rectangle {

id: root

width: 320; height: 240

color: "lightgray"

signal sendClicked(string str) // 定义信号

Text {

id: txt

text: "Clicked me"

font.pixelSize: 20

anchors.centerIn: parent

}

MouseArea {

id: mouse_area

anchors.fill: parent  // 有效区域

onClicked: {

root.sendClicked("Hello, Python3")    # 发射信号到Python

}

}

}

运行结果如下:

(4)Python调用QML函数

QML中创建一个函数,

1

2

3

function updateRotater() {

rotater.angle += 45

}

Python中创建一个rootObject对象,并连接这个函数,

1

2

root = view.rootObject()

timer.timeout.connect(root.updateRotater)

以下是一个完整的例子:

例子中,每隔1s,指针会旋转45°。

Python3代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# -*- coding: GBK -*-

from PyQt5.QtCore import QUrl, QTimer

from PyQt5.QtGui import QGuiApplication

from PyQt5.QtQuick import QQuickView

if __name__ == '__main__':

path = 'test.qml'   # 加载的QML文件

app = QGuiApplication([])

view = QQuickView()

view.engine().quit.connect(app.quit)

view.setSource(QUrl(path))

view.show()

timer = QTimer()

timer.start(2000)

root = view.rootObject()

timer.timeout.connect(root.updateRotater)

app.exec_()

QML代码(文件名保存为test.qml):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import QtQuick 2.0

Rectangle {

id: page

width: 500; height: 200

color: "lightgray"

function updateRotater() {

rotater.angle += 45

}

Rectangle {

id: rotater

property real angle : 0

x: 240; y: 95

width: 100; height: 5

color: "black"

transform: Rotation {

origin.x: 10; origin.y: 5

angle: rotater.angle

}

}

}

运行结果如下:

本人水平有限,如果有疏漏之处,欢迎指点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些35岁的程序员都去哪了

阅读本文大概需要11分钟。大家好,我是findyi,前段时间写过一篇关于大龄程序员的文章:那些40岁的程序员都去哪了,引发了大家的思考和讨论,不少读者私聊问:除了这些出路,还有没有其他可能&#xf…

Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 二)...

在Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据一)中,解释了如何把Crystal Report整合到Sharepoint2010并把报表数据显示出来,但这样并不完整,因为我们在开发时是以系统帐户进…

那些拧不开瓶盖的女生全都是装的?理工男这样想......

全世界只有3.14 % 的人关注了爆炸吧知识昨天,超模君我正在思考人生,八岁的表妹突然提着一瓶矿泉水站在了我的面前。她可怜兮兮的说:“我想喝水,但是拧不开”。我:“........."超模君我明明亲眼见过她一口气拧开过…

java 代码同步_Java同步代码块 转

Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字(synchronized)Java中的同步块用s…

Office 2010 64位版本

最新的Office 2010有了x86和x64两种不同的版本,众所周知的使用x64版本具有可以支持更大的内存等特点,但是也会出现一定的兼容性问题。其中感觉影响比较大的是Access的32位版本和64位版本创建的数据库无法通用,这样以前创建的Access文件就无法…

JUnit 测试

Junit 使用 1、忽略测试方法。在使用Test的方法上使用Ignore,将不会对此方法进行测试 2、测试套件 解决的问题: 1、对测试类进行统一测试,而不必在单独测试类上一个一个进行测试。 使用JUnit的RunWith以及SuiteClassses注解,Suite…

【另类见解】秒杀并非高不可攀

“一提到秒杀很简单这个话题,我知道要被别人鄙视了:你不懂高并发... 这年头开头不画个思维导图都觉得掉价image谈到秒杀,网络上不少于几千片文章,但是大多大同小异。如果你的微信当中关注了几个编程技术类的公众号,我敢…

我又相信爱情了!

1 圣诞限定款的肥宅快乐水更好喝了吗?不!更贵了2 周边鬼才!这手机壳我爱了3 你以为是个王者,其实是个大脸......4 高温超导材料达到临界温度后能使物体悬浮在不同位置5 火山爆发你见过吗?6 我又相信爱情了!…

opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组

题目描述:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1]。其中B中的元素B[i]A[0] * A[1]... * A[i-1] * A[i1]... * A[n-1]。不能使用除法。解题思路:首先,仔细理解题意,B[i]是A数组所有元素的乘积,但是没…

python引用numpy出错_使用numpy时出错

我尝试使用pandas python进行excel操作。在每当我尝试使用pandas库时,它都会给我错误的提示:numpy没有安装。在现在,当我尝试安装pip install numpy和pip安装pandas时,它说需求已经满足了。在但是当我尝试做一个简单的numpy教程时…

中国移动:面向全业务运营的安全管理平台

在2008年的一个电信运营支撑系统论坛上,来自中国移动的集团网络部的安全副处长周智先生做了一个题为《面向全业务运营的安全运行管理系统定位及建设思路》的报告。 在这个报告中,周处首先分析了全业务运营环境下的安全挑战,然后提出了在全业务…

记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析

一:背景 1. 讲故事说实话,这篇dump我本来是不准备上一篇文章来解读的,但它有两点深深的感动了我。无数次的听说用 Unity 可做游戏开发,但百闻不如一见。游戏中有很多金庸武侠小说才有的名字,太赏心悦目了。000000df315…

成年人的数学公式

1 成年人的数学公式2 唯一对我说过“别走好吗”的人3 主人发起疯来有多可怕4 别人家的狗看到主人有危险▼你家的……▼5 蜘蛛捕食瞬间6 蜡烛重燃(冒的白烟是固态小颗粒的石蜡蒸汽,可燃)你点的每个赞,我都认真当成了喜欢

ubuntu运行python ide_在Ubuntu-16.04中安装Python可视化IDE——Spyder

Spyder是Python(x,y)的作者为它开发的一个简单的集成开发环境。和其他的Python开发环境相比,它最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值。Spyder的界面由许多窗格构成,用户可以根据自己的喜好调整它们的…

Linux查看系统信息的一些命令及查看已安装软件包的命令(转)

系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所…

日历签到 java_我的Android案例―签到日历

public class MainActivity extends Activity {//Log标签private static final String TAG "SIGN";//声明对象private Button sign;private TextView show;private GridView myDate;//获得本地时间Time nowTime new Time();//1个月内的天数private int dayMaxNum;p…

phpMailer 配置 企业邮局 163

phpMailer的两种配置,记录一下,差别在一个要写完整邮件地址,一个只要填前面的部分。一、自己的企业邮局发信$mail new PHPMailer();//$body file_get_contents("mail/".$date.".html"); //$bo…

Linux运维实战之DNS的高级配置(转发器、视图等)

上次博文我们具体配置了一台DNS服务器并实现了主辅之间的区域传送,本次博文我们来看看DNS的一些高级配置。 在进行DNS的高级配置之前,必须要理解DNS的原理(参见http://sweetpotato.blog.51cto.com/533893/1596973) 并且对DNS的基础…

POJ1269 Intersecting Lines 计算几何 C语言

题目:http://poj.org/problem?id1269 题目大意:给出四个点确定两条直线。如果是一条线输出“LINE”,如果平行输出“NONE”, 如果有交点输出交点坐标。 思路:注意是直线,不是线段啊。 用两点式推出两条直线…

史上最烧脑的学习方法,看完瞬间涨姿势!

▲ 点击查看 在美国,有一个天才儿童计划,选拔一批“天才”儿童进入天才班。这个计划是为了保证每个人接受平等教育机会的同时,也为精英成长提供合适的土壤。美国所谓的天才和精英是怎样的标准呢?进入天才班的儿童首先要通过一个叫…