pyqt5与html数据交互原理,PyQt5系列教程:Web页面交互初探2-1(QWebChannel和QWebEngineView的综合使用)...

部分核心代码解析

共享类

我们先来看看共享类。

class Myshared(QWidget):

finish = pyqtSignal(list)

def __init__(self):

super().__init__()

def PyQt52WebValue(self):

return "666"

def Web2PyQt5Value(self, str):

info = str.split()

fullinfo = "用户名:{},密码:{}".format(info[0], info[1])

QMessageBox.information(self, "从Web页面传值到PyQt5", fullinfo)

self.finish.emit(info)

value = pyqtProperty(str, fget=PyQt52WebValue, fset=Web2PyQt5Value)

在这个共享类里面我们比以前多了一个新的知识点:pyqtProperty。

使用pyqtProperty()函数定义新的PyQt属性。 它的使用方式与标准的Python property()函数相同。 事实上,以这种方式定义的PyQt属性也表现为Python属性。

那么问题又来了,什么是Python property()函数??

根据Python的帮助文档上的介绍,它的完全形式是这样的:

class property(fget=None, fset=None, fdel=None, doc=None)

作用是返回Python的某一个属性。

fget是获取属性值的函数。 fset是用于设置属性值的函数。 fdel是用于删除属性值的函数。 doc为该属性创建了一个docstring。

典型用法是定义可被管理的属性x:

class C:

def __init__(self):

self._x = None

def getx(self):

return self._x

def setx(self, value):

self._x = value

def delx(self):

del self._x

x = property(getx, setx, delx, "I'm the 'x' property.")

如果c是C的实例,c.x将调用getter,c.x = value将调用setter和del c.x将调用delx。

如果给定,doc将是property属性的docstring。 否则,该属性将复制fget的docstring(如果存在)。

这使得使用property()作为装饰器可以轻松创建只读属性:

class Parrot:

def __init__(self):

self._voltage = 100000

[email protected]

def voltage(self):

"""得到当前voltage的值"""

return self._voltage

@property装饰器将voltage()方法转换为具有相同名称的只读属性。

属性对象具有可用作装饰器的getter,setter和deleter方法,这些方法创建属性的副本,并将相应的访问函数设置为装饰函数。举例如下:

class C:

def __init__(self):

self._x = None

[email protected]

def x(self):

"""我是'x'属性"""

return self._x

[email protected]

def x(self, value):

self._x = value

[email protected]

def x(self):

del self._x

此代码与第一个示例完全等效:

x = property(getx, setx, delx, "I'm the 'x' property.")

请务必为其他函数指定与原始属性相同的名称(在本例中为x)。

返回的属性对象还具有与构造函数参数对应的属性fget,fset和fdel。

在PyQt5中,它是这么用的:

PyQt5.QtCore.pyqtProperty(type[, fget=None[, fset=None[, freset=None[, fdel=None[, doc=None[, designable=True[, scriptable=True[, stored=True[, user=False[, constant=False[, final=False[, notify=None[, revision=0]]]]]]]]]]]]])

感觉很复杂!

创建一个既作为Python属性又作为PyQt属性的属性。

参数:

type - 属性的类型。 它是Python类型对象或字符串。

fget - 用于获取属性值的,可选。

fset - 用于设置属性值的,可选。

freset - 用于将属性值重置为其默认值的,可选。

fdel - 用于删除属性的,可选。

doc - 属性的docstring,可选。

designable - 设置Qt DESIGNABLE标志,可选。

scriptable - 设置Qt SCRIPTABLE标志,可选。

stored - 设置Qt STORED标志,可选。

user - 设置Qt USER标志,可选。

constant - 设置Qt CONSTANT标志,可选。

final - 设置Qt FINAL标志,可选。

notify - 未绑定通知信号,可选。

revision - 导出到QML的修订版。

返回类型:属性对象。

也可以使用pyqtProperty()作为装饰器,方法与标准Python property()函数相同。 以下示例显示如何使用getter和setter定义int属性:

from PyQt5.QtCore import QObject, pyqtProperty

class Foo(QObject):

def __init__(self):

QObject.__init__(self)

self._total = 0

[email protected](int)

def total(self):

return self._total

[email protected]

def total(self, value):

self._total = value

好了,现在我们回过头来再看下我们自己定义的共享类。

def PyQt52WebValue(self):

return "666"

写上,但是后面我们没用。

def Web2PyQt5Value(self, str):

info = str.split()

fullinfo = "用户名:{},密码:{}".format(info[0], info[1])

QMessageBox.information(self, "从Web页面传值到PyQt5", fullinfo)

self.finish.emit(info)

当我们得到从Web页面传来值的时候,我们处理一下,分成用户名和密码,并将其通过自定义信号发射出去。

value = pyqtProperty(str, fget=PyQt52WebValue, fset=Web2PyQt5Value)

形成一个属性。具体哪里使用,我们后面会介绍。

可能到这里你有点云里雾里的感觉,不要急,接下来的更精彩!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值