对于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

}

}

}

运行结果如下:

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

python qt信号在qml 的使用_QML与Python通信相关推荐

  1. python qt信号在qml 的使用_QML使用Python的函数过程解析

    有2种方法: 一. QML中定义一个信号,连接Python里的函数: 这里的函数不用特意指明为槽函数,普通函数即可. QML的信号连接Python的函数 QML: 首先在QML中定义一个信号,这里的信 ...

  2. python qt信号在qml 的使用_Python和C++混合使用QML开发GUI

    pyqt和qml结合的中文资很少,在baidu上搜索,基本上就是浪费时间.在国外的blog上,有零星的几篇,但是介绍好的少.在stackoverflow上看到一篇关于pyside,发现pyside,发 ...

  3. Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)

    目录 1.创建项目 2.将.ui文件生成.py文件 2.1.Eric 6编译 2.2.Python命令行编译 2.3.脚本编译 3.界面.逻辑分离思想 在开始本文之前提醒各位朋友,Python记得安装 ...

  4. python qt gui与数据可视化编程 pdf_《Python Qt GUI与数据可视化编程》第13章

    第13章 PyQtDataVisualization三维绘图 Data Visualization是Qt中的一个三维数据可视化模块,可以绘制三维柱状图.三维散点图.三维曲面等.Data Visuali ...

  5. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

  6. python PyQt5 Signal类 (Signal类提供了一种以pythonic方式声明和连接Qt信号的方法)(connect()、disconnect()、emit())

    https://doc.qt.io/qtforpython/PySide2/QtCore/Signal.html?highlight=connect#PySide2.QtCore.Signal.con ...

  7. Qt Widgets、QML、Qt Quick的概念与区别

    1 QML 和 Qt Quick 是什么关系? 从概念上区分 QML 是一种用户界面规范和标记语言,它允许开发/设计人员创建高性能.流畅的动画和具有视觉吸引力的应用程序. 这里,主要涉及两点: 用户界 ...

  8. python qt教程_Python - Python Qt 开发教程(1)

    前言写文章之前我都喜欢加个前言,说说自己的感受,这次也不例外. 这篇文章是学习 Python Qt 半年来出的教程,因此教程的质量并不能保证,只是将自己的经验分享给大家. Python Qt 图形界面 ...

  9. Qt Creator分析QML应用程序

    Qt Creator分析QML应用程序 分析QML应用程序 使用QML Profiler 指定Flushing设置 附加到正在运行的Qt Quick应用程序 分析收集的数据 选择事件范围 了解数据 分 ...

最新文章

  1. [模板][持续更新]欧拉回路与欧拉路径浅析
  2. 细节决定成败(竞赛错题经验总结)
  3. 使用AMDU工具从无法MOUNT的DISKGROUP中抽取数据文件
  4. 时隔5年,再次接触数字图像处理
  5. seleniumIDE
  6. 【转载】如何做一份突出的PPT
  7. SQLite 入门教程(三)好多约束 Constraints
  8. KVM 虚拟机自动克隆脚本
  9. 现代软件工程讲义 4 团队和流程
  10. qt根据散点图拟合曲线_R可视化 | 散点图系列(1)
  11. 精美的案例教你如何像杂志一样排版!
  12. [论文阅读] Scene Context-Aware Salient Object Detection
  13. Linux中关机与重启命令
  14. 【源】ArrayDeque,Collection框架中不起眼的一个类
  15. python3.9出了吗_Python 3.9正式版,新特性提前一睹为快
  16. Oracle正确迁移数据文件,Oracle数据文件迁移知多少?
  17. 自定义tensorflow的tf.image.resize_bicubic方法
  18. Spark RDD distinct 算子
  19. Unity 微信小游戏转回WEBGL发布设置
  20. 一键复制粘贴工具使用教程

热门文章

  1. Mercurial黄昏,Bitbucket宣布全面转向Git
  2. Visual Studio 2019 16.1 使用 .NET Core 3.0
  3. DDD战略设计相关核心概念的理解
  4. 实现自己的.NET Core配置Provider之Yaml
  5. 从Unity3D编译器升级聊起Mono
  6. 使用Akka.net开发第一个分布式应用
  7. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
  8. 值得推荐的微软技术公众号推荐
  9. 【CC精品教程】任务三:CC刺像控点,提交空三,新建重建项目(三维格网、三维点云、DOM和DSM)
  10. ArcGIS实验教程——实验四:数字化属性数据的采集