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
}
}
}
运行结果如下:
本人水平有限,如果有疏漏之处,欢迎指点。
python qt信号在qml 的使用_QML与Python通信相关推荐
- python qt信号在qml 的使用_QML使用Python的函数过程解析
有2种方法: 一. QML中定义一个信号,连接Python里的函数: 这里的函数不用特意指明为槽函数,普通函数即可. QML的信号连接Python的函数 QML: 首先在QML中定义一个信号,这里的信 ...
- python qt信号在qml 的使用_Python和C++混合使用QML开发GUI
pyqt和qml结合的中文资很少,在baidu上搜索,基本上就是浪费时间.在国外的blog上,有零星的几篇,但是介绍好的少.在stackoverflow上看到一篇关于pyside,发现pyside,发 ...
- Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)
目录 1.创建项目 2.将.ui文件生成.py文件 2.1.Eric 6编译 2.2.Python命令行编译 2.3.脚本编译 3.界面.逻辑分离思想 在开始本文之前提醒各位朋友,Python记得安装 ...
- python qt gui与数据可视化编程 pdf_《Python Qt GUI与数据可视化编程》第13章
第13章 PyQtDataVisualization三维绘图 Data Visualization是Qt中的一个三维数据可视化模块,可以绘制三维柱状图.三维散点图.三维曲面等.Data Visuali ...
- Python Qt GUI设计:信号与槽的使用方法(基础篇—7)
目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...
- python PyQt5 Signal类 (Signal类提供了一种以pythonic方式声明和连接Qt信号的方法)(connect()、disconnect()、emit())
https://doc.qt.io/qtforpython/PySide2/QtCore/Signal.html?highlight=connect#PySide2.QtCore.Signal.con ...
- Qt Widgets、QML、Qt Quick的概念与区别
1 QML 和 Qt Quick 是什么关系? 从概念上区分 QML 是一种用户界面规范和标记语言,它允许开发/设计人员创建高性能.流畅的动画和具有视觉吸引力的应用程序. 这里,主要涉及两点: 用户界 ...
- python qt教程_Python - Python Qt 开发教程(1)
前言写文章之前我都喜欢加个前言,说说自己的感受,这次也不例外. 这篇文章是学习 Python Qt 半年来出的教程,因此教程的质量并不能保证,只是将自己的经验分享给大家. Python Qt 图形界面 ...
- Qt Creator分析QML应用程序
Qt Creator分析QML应用程序 分析QML应用程序 使用QML Profiler 指定Flushing设置 附加到正在运行的Qt Quick应用程序 分析收集的数据 选择事件范围 了解数据 分 ...
最新文章
- [模板][持续更新]欧拉回路与欧拉路径浅析
- 细节决定成败(竞赛错题经验总结)
- 使用AMDU工具从无法MOUNT的DISKGROUP中抽取数据文件
- 时隔5年,再次接触数字图像处理
- seleniumIDE
- 【转载】如何做一份突出的PPT
- SQLite 入门教程(三)好多约束 Constraints
- KVM 虚拟机自动克隆脚本
- 现代软件工程讲义 4 团队和流程
- qt根据散点图拟合曲线_R可视化 | 散点图系列(1)
- 精美的案例教你如何像杂志一样排版!
- [论文阅读] Scene Context-Aware Salient Object Detection
- Linux中关机与重启命令
- 【源】ArrayDeque,Collection框架中不起眼的一个类
- python3.9出了吗_Python 3.9正式版,新特性提前一睹为快
- Oracle正确迁移数据文件,Oracle数据文件迁移知多少?
- 自定义tensorflow的tf.image.resize_bicubic方法
- Spark RDD distinct 算子
- Unity 微信小游戏转回WEBGL发布设置
- 一键复制粘贴工具使用教程
热门文章
- Mercurial黄昏,Bitbucket宣布全面转向Git
- Visual Studio 2019 16.1 使用 .NET Core 3.0
- DDD战略设计相关核心概念的理解
- 实现自己的.NET Core配置Provider之Yaml
- 从Unity3D编译器升级聊起Mono
- 使用Akka.net开发第一个分布式应用
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
- 值得推荐的微软技术公众号推荐
- 【CC精品教程】任务三:CC刺像控点,提交空三,新建重建项目(三维格网、三维点云、DOM和DSM)
- ArcGIS实验教程——实验四:数字化属性数据的采集