前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pyqt5与QML开发小结

pyqt5与QML开发小结

作者头像
py3study
发布2020-01-17 13:19:44
1.4K0
发布2020-01-17 13:19:44
举报
文章被收录于专栏:python3python3

遇见的坑

qt 5.11 与 qt 5.12 中Qquick的差异还是蛮大的,由开发环境:Pyqt5.11 + Qt5.12 部署到 Pyqt5.11 + Qt5.11时遇到以下问题:

1.当一个Item引用另一个Item,当层次比较深入时,有可能引用不到此Item对象。这时可以用alias别名尝试把此对象作为顶层类的属性。另还有一个可能是因为Item文件的命名冲突,比如我把Item文件命名为ContentLeft.qml就会出现一些莫名奇妙的问题,后来把名称改为ContentLeftF.qml就没有。由“ContentLeft"改成”ContentLeftF.qml"问题解决。

2.有些str类型的属性可以直接用于QML,但有些会提示QString不对

代码语言:javascript
复制
    #barcode
    @pyqtProperty(str,notify=barcodeChanged)
    def barcode(self):
        return self._barcode

    @barcode.setter
    def barcode(self, value):
        self._barcode = value
        self.barcodeChanged.emit(value)

把以上写法改为下面写法即没问题:

代码语言:javascript
复制
projectName = pyqtProperty(str, fget=getProjectValue, fset= setProjectValue, notify=projectNameChanged)

 一些套路

1.把python类注册成qml类

代码语言:javascript
复制
qmlRegisterType(CameraOpencv,'MyCamera',1,0,'MyCustomOpenCVItem')

可以直接在qml用

代码语言:javascript
复制
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

代码语言:javascript
复制
        self.imageModel = ModelImages()
        self.rootContext().setContextProperty('ImagesModel', self.imageModel)

qml中直接调用

代码语言:javascript
复制
        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中用的属性

方法一:

代码语言:javascript
复制
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)

方法二:

代码语言:javascript
复制
projectName = pyqtProperty(str, fget=getProjectValue, fset= setProjectValue, notify=projectNameChanged)

4.qml动态设置component

代码语言:javascript
复制
                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插件

先声明:

代码语言:javascript
复制
os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard"

qml中:

代码语言:javascript
复制
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; }
            }
        }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 遇见的坑
  •  一些套路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档