用 PyQt5 和 QML 做了个小工具,,感觉 PyQt 和 QML 的交互比较繁琐

2018-10-30 16:47:52 +08:00
 XIVN1987

繁琐主要体现在:

1、Python 中不能使用 QML 中的 id 查找控件,需要用 objectName,,一般这两者值是完全一样的,重复劳动

ComboBox {
	id: cmbPort
	objectName: "cmbPort"
	Layout.minimumWidth: 100 * 2 + 10 * 2 + lblSer.width
	model: ports
}

2、pyqtProperty 不太好用,,搞了好久没用起来,放弃了

3、Python 中无法直接使用 QML 中的控件,必须用 findObject 在 Python 中再定义一遍

self.cmbPort = self.win.findChild(QObject, 'cmbPort')
self.cmbBaud = self.win.findChild(QObject, 'cmbBaud')
self.cmbData = self.win.findChild(QObject, 'cmbData')
self.cmbParity = self.win.findChild(QObject, 'cmbParity')
self.cmbStop = self.win.findChild(QObject, 'cmbStop')

self.txtMain = self.win.findChild(QObject, 'txtMain')
self.txtSend = self.win.findChild(QObject, 'txtSend')

self.chkRHex = self.win.findChild(QObject, 'chkRHex')
self.chkWave = self.win.findChild(QObject, 'chkWave')
self.chkTHex = self.win.findChild(QObject, 'chkTHex')
self.chkLine = self.win.findChild(QObject, 'chkLine')
self.chkTime = self.win.findChild(QObject, 'chkTime')

self.btnOpen = self.win.findChild(QObject, 'btnOpen')

4、Python 中不能直接访问 QML 控件的属性,而需要用 property、setProperty 间接访问

比如 CombBox 控件有 currentText 属性,不能用 self.cmbPort.currentText 访问,而必须用 self.cmbPort.property('currentText')访问

5、文档资料很少,,没有应用示例

代码在此:https://github.com/XIVN1987/QmlSer

运行效果:

9080 次点击
所在节点    Python
12 条回复
izoabr
2018-10-30 17:12:50 +08:00
好几次想试试 QML,但还是觉得费劲,干脆就还是 designer 直接排了,省事还可视化
XIVN1987
2018-10-30 17:20:56 +08:00
@izoabr
是的,现在看来 Qt Widget 还是要比 Qt Quick 用起来更简单、快捷,,希望 Qt 官方的 Python 绑定能简化 Python 和 QML 的交互

不过 Widget 是给电脑桌面 GUI 设计的,没有考虑手机、平板等设备,,如果想开发手机应用的话可能还是得上 Qt Quick
TangMonk
2018-10-30 17:38:40 +08:00
PyQt 打包方便吗
XIVN1987
2018-10-30 17:55:54 +08:00
@TangMonk
挺简单,,“ pyinstaller -F xxx.py ”一条命令即可,,打包后最小 15M,也还能接受
chiu
2018-10-30 17:59:03 +08:00
@XIVN1987 lz 大佬,请教一下,我用 pyinstaller 打包后的 pyqt 应用在 win 下启动十分缓慢,要 40s 左右,运行倒挺流畅的。是什么参数配置不对吗?
TangMonk
2018-10-30 18:08:17 +08:00
@XIVN1987 打包速度呢
kokutou
2018-10-30 18:12:10 +08:00
@chiu 不打包成单 exe 试试?
XIVN1987
2018-10-30 18:24:40 +08:00
@TangMonk
打包速度很快,不到一分钟(我做的程序都比较小)
XIVN1987
2018-10-30 18:28:47 +08:00
@chiu
确实比直接运行.py 慢,,我自己用都是.py ,,只有给别人用的时候才打包
不过好像也没这么慢吧,,可能你的程序功能比较复杂吧,,
chenqh
2018-10-30 20:52:14 +08:00
为什么要这么专业呢?随便写个 UI 就好了。。
cyrbuzz
2018-10-30 21:07:38 +08:00
感觉最大的硬伤是 QML 没有文档。
waterlaw
2019-01-16 09:26:55 +08:00
@XIVN1987 楼主你 github 这个 qml 我 qml.rootContext().setContextProperty('Ser', QmlSer(qml.rootContext(), qml.rootObjects()[0])), 读取不到 rootObjects 啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/502628

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX