V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
XIVN1987
V2EX  ›  Python

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

  •  
  •   XIVN1987 · 2018-10-30 16:47:52 +08:00 · 9240 次点击
    这是一个创建于 2250 天前的主题,其中的信息可能已经有所发展或是发生改变。

    繁琐主要体现在:

    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

    运行效果:

    QmlSer

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

    不过 Widget 是给电脑桌面 GUI 设计的,没有考虑手机、平板等设备,,如果想开发手机应用的话可能还是得上 Qt Quick
    TangMonk
        3
    TangMonk  
       2018-10-30 17:38:40 +08:00
    PyQt 打包方便吗
    XIVN1987
        4
    XIVN1987  
    OP
       2018-10-30 17:55:54 +08:00
    @TangMonk
    挺简单,,“ pyinstaller -F xxx.py ”一条命令即可,,打包后最小 15M,也还能接受
    chiu
        5
    chiu  
       2018-10-30 17:59:03 +08:00 via Android
    @XIVN1987 lz 大佬,请教一下,我用 pyinstaller 打包后的 pyqt 应用在 win 下启动十分缓慢,要 40s 左右,运行倒挺流畅的。是什么参数配置不对吗?
    TangMonk
        6
    TangMonk  
       2018-10-30 18:08:17 +08:00 via Android
    @XIVN1987 打包速度呢
    kokutou
        7
    kokutou  
       2018-10-30 18:12:10 +08:00 via Android
    @chiu 不打包成单 exe 试试?
    XIVN1987
        8
    XIVN1987  
    OP
       2018-10-30 18:24:40 +08:00
    @TangMonk
    打包速度很快,不到一分钟(我做的程序都比较小)
    XIVN1987
        9
    XIVN1987  
    OP
       2018-10-30 18:28:47 +08:00
    @chiu
    确实比直接运行.py 慢,,我自己用都是.py ,,只有给别人用的时候才打包
    不过好像也没这么慢吧,,可能你的程序功能比较复杂吧,,
    chenqh
        10
    chenqh  
       2018-10-30 20:52:14 +08:00
    为什么要这么专业呢?随便写个 UI 就好了。。
    cyrbuzz
        11
    cyrbuzz  
       2018-10-30 21:07:38 +08:00
    感觉最大的硬伤是 QML 没有文档。
    waterlaw
        12
    waterlaw  
       2019-01-16 09:26:55 +08:00
    @XIVN1987 楼主你 github 这个 qml 我 qml.rootContext().setContextProperty('Ser', QmlSer(qml.rootContext(), qml.rootObjects()[0])), 读取不到 rootObjects 啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5425 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:05 · PVG 17:05 · LAX 01:05 · JFK 04:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.