pyqt5与QML开发小结
2019-04-11 10:16:05来源:博客园 阅读 ()
遇见的坑
qt 5.11 与 qt 5.12 中Qquick的差异还是蛮大的,由开发环境:Pyqt5.11 + Qt5.12 部署到 Pyqt5.11 + Qt5.11时遇到以下问题:
1.当一个Item引用另一个Item,当层次比较深入时,有可能引用不到此Item对象。这时可以用alias别名尝试把此对象作为顶层类的属性。另还有一个可能是因为Item文件的命名冲突,比如我把Item文件命名为ContentLeft.qml就会出现一些莫名奇妙的问题,后来把名称改为ContentLeft.qml就没有。
2.有些str类型的属性可以直接用于QML,但有些会提示QString不对
#barcode @pyqtProperty(str,notify=barcodeChanged) def barcode(self): return self._barcode @barcode.setter def barcode(self, value): self._barcode = value self.barcodeChanged.emit(value)
把以上写法改为下面写法即没问题:
projectName = pyqtProperty(str, fget=getProjectValue, fset= setProjectValue, notify=projectNameChanged)
一些套路
1.把python类注册成qml类
qmlRegisterType(CameraOpencv,'MyCamera',1,0,'MyCustomOpenCVItem')
可以直接在qml用
import QtQuick 2.9 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import MyCamera 1.0 Item{ id:root property alias myCustomOpenCVItem: myCustomOpenCVItem Rectangle{ color:"black" anchors.fill: parent MyCustomOpenCVItem{ id:myCustomOpenCVItem objectName:"camera_win" anchors.fill:parent } MouseArea{ anchors.fill: parent onClicked: { content.contentMiddle.myCustomOpenCVItem.save() } } } }
2.把python对象传至qml
self.imageModel = ModelImages() self.rootContext().setContextProperty('ImagesModel', self.imageModel)
qml中直接调用
ListView { id : m_listView width: parent.width height: root.height clip: true model: ImagesModel //modelImages delegate: m_delegate spacing: 5 focus: true verticalLayoutDirection: ListView.BottomToTop add: Transition { NumberAnimation { properties: "y";duration: 400 } } remove: Transition { NumberAnimation { properties: "y";duration: 400 } } }
3.设置可在qml中用的属性
方法一:
self._goodsName = '' #当前商品名称 goodsNameChanged = pyqtSignal(str) @pyqtProperty(str,notify=goodsNameChanged) def goodsName(self): return self._goodsName @goodsName.setter def goodsName(self, value): self._goodsName = value self.goodsNameChanged.emit(value)
方法二:
projectName = pyqtProperty(str, fget=getProjectValue, fset= setProjectValue, notify=projectNameChanged)
4.qml动态设置component
function getLoader (){ switch (uploadStatus) { case "imgUploadFail": return uploadFail case "imgUploadOK": return uploadOK case "imgUploading": return uploading case "imgUploadReady": return null default: return null } } Loader{ id:currLoad anchors.fill:parent sourceComponent:getLoader() }
5.使用虚拟键盘
需要先安装VirtualKeyboard插件
先声明:
os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard"
qml中:
import QtQuick.VirtualKeyboard 2.2 //键盘 InputPanel{ id: vkb z:3 visible: false anchors.bottom: parent.bottom width: parent.width * 0.85 height: parent.height * 0.3 x:parent.width * 0.5 - width * 0.5 //这种集成方式下点击隐藏键盘的按钮是没有效果的, //只会改变active,因此我们自己处理一下 onActiveChanged: { if(!active) { visible = false; } } }
原文链接:https://www.cnblogs.com/xiaoguanqiu/p/10608498.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python 之 前端开发(form标签、单选框、多选框、file上传文 2019-08-13
- python 之 前端开发(HTTP协议、head标签、img标签、a标签、 2019-08-13
- 开发工具--PyCharm 2019-07-24
- Python入门学习——PyQt5程序基本结构 2019-07-24
- Python各个岗位的开发流程 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash