IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python qml 实现跟py代码的双向绑定,类似wpf的mvvm和 vue的开发模式 -> 正文阅读

[Python知识库]Python qml 实现跟py代码的双向绑定,类似wpf的mvvm和 vue的开发模式

学习pyqt第二天,研究了一整天这个模式,各种搜索,并没有太多这方面的资料!

经过自己不断的修改和试错。最终得出了这种方式,如果大家有更优的方式,希望大家能评论告诉我一下!

好,废话不多说,贴代码!首先是定义相当于WPF中ViewModel类,PYQT5和PYQT6代码一样

from PyQt6.QtQuick import QQuickView
from PyQt6.QtQml import qmlRegisterType,QQmlApplicationEngine
from PyQt6.QtCore import *
from PyQt6.QtCore import QCoreApplication, Qt, QUrl,pyqtProperty
from PyQt6.QtWidgets import QApplication
import sys 

#viewModel类,这边写属性以及窗体事件代码
class MainWindowViewModel(QObject):
    
    def __init__(self, parent=None):
        super().__init__(parent)

    #-------------定义属性开始-------------------

    #私有变量,用来操作和初始化值
    _userName = '我是初始值'

    #定义pyqtSignal,跟pyqtProperty的类型需要一直
    userNameChanged = pyqtSignal(str)

    #定义pyqtProperty属性,第一个是属性的类型,第二个是notify
    @pyqtProperty(str,notify=userNameChanged)
    def userName(self):
        return self._userName

    #定义属性改变事件,py代码改变属性值将调用这个方法
    @userName.setter
    def userName(self, value):
        self._userName = value
        #将属性值更新到qml中
        self.userNameChanged.emit(value)

    #-------------定义属性结束------------------------

    #-------------这边开始定义事件--------------------

    #使用pyqtSlot来定义返回值,如无返回值则可以不设置
    @pyqtSlot(result=str)
    def outputString(self):
        print(self.userName)
        return 'success'

    #带参数的事件或者方法,定义参数类型就行,可以有多个参数类型,需要与py方法的参数对应
    @pyqtSlot(str,int,result=str)
    #self是必须带上的,放在第一个
    def setString(self,name,val):
        self.userName='我被py代码改变'
        print(name+":"+ str(val))

    #-------------定义事件结束--------------------

然后在main函数中设置对象

if __name__ == '__main__':
    app = QApplication(sys.argv)

    #-------------------从这边开始设置-----------------------
    view = QQuickView()
    #实例化ViewModel类
    viewModel = MainWindowViewModel()

    context = view.rootContext()
    #将ViewModel绑定到qml代码中的viewModel变量,qml通过这个来调用相关属性和方法
    context.setContextProperty("viewModel",viewModel)
    
    view.setSource(QUrl('main.qml'))

    #-------------------到这边设置完成-----------------------

    view.engine().quit.connect(app.quit)
    #设置窗体标题
    view.setTitle('例子')
    view.show()

    sys.exit(app.exec())

接下来是QML的写法,这边属性的双向绑定我捉摸出了2种写法,大家自行选择就行

TextField {
                    id: txt_userName
                    placeholderText: "请输入账号"
                    color: "#D9000000"

                    //------------------------关键绑定代码开始-----------------------------


                    //这句话可以将qml属性值绑定到py变量
                    onEditingFinished: viewModel.userName=text
                    //这句代码py变量绑定到qml属性
                    text: viewModel.userName

                    /* 第二种写法
                    Binding {
                        property: "text"
                        target: txt_userName
                        value: viewModel.userName
                    }
                    Binding {
                        property: "userName"
                        target: viewModel
                        value: txt_userName.text
                    }
                    */


                    //------------------------关键绑定代码结束-----------------------------
                    width: 120
                    background: Rectangle
                    {
                        border.color: "#26000000"
                    }
            }
        }

接下来是事件的写法

Button {
        width: 60
        height: 30
        font.family: "Microsoft YaHei"
        text: "测试调用"
        //事件
        onClicked: {
            viewModel.outputString()
            //直接调用ViewModel中定义的方法就行
            viewModel.setString('设置参数', 1)
            //获取属性
            console.log(viewModel.userName)
        }
    }

以上就是我今天研究出来的方法,经过自己的多次测试与修改!

转载请注明出处就行!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:57:04  更:2022-01-11 23:58:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:23:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码