【发布时间】:2021-11-30 10:05:14
【问题描述】:
试图理解https://wiki.python.org/moin/PyQt/Binding%20widget%20properties%20to%20Python%20variables:
“将小部件属性绑定到 Python 变量”
在我修改后的代码下方,我花了一段时间,但更好地可视化bind,此处的示例代码做了什么:
def bind(objectName, propertyName, type):
def getter(self):
return type(self.findChild(QObject, objectName).property(propertyName).toPyObject())
def setter(self, value):
self.findChild(QObject, objectName).setProperty(propertyName, QVariant(value))
return property(getter, setter)
我的完整代码是:
import sys
from PyQt5.QtWidgets import QWidget, QLineEdit, QTextEdit, QCheckBox, QFormLayout, QPushButton
from PyQt5 import QtWidgets
def bind(objectName, propertyName, type):
def getter(self):
return type(self.findChild(QObject, objectName).property(propertyName).toPyObject())
def setter(self, value):
self.findChild(QObject, objectName).setProperty(propertyName, QVariant(value))
return property(getter, setter)
class Window(QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.nameEdit = QLineEdit()
self.nameEdit.setObjectName("nameEdit")
self.addressEdit = QTextEdit()
self.addressEdit.setObjectName("addressEdit")
self.contactCheckBox = QCheckBox()
self.contactCheckBox.setObjectName("contactCheckBox")
self.button_1 = QPushButton('press me !!!')
self.button_1.clicked.connect(self.pushButton_1_Pressed)
self.button_2 = QPushButton('press me !!! second')
self.button_2.clicked.connect(self.pushButton_2_Pressed)
self.layout = QFormLayout(self)
self.layout.addRow(self.tr("Name:"), self.nameEdit)
self.layout.addRow(self.tr("Address:"), self.addressEdit)
self.layout.addRow(self.tr("Receive extra information:"), self.contactCheckBox)
self.layout.addWidget(self.button_1)
self.layout.addWidget(self.button_2)
self.setLayout(self.layout)
self.name = bind('nameEdit', 'text', str)
self.address = bind("addressEdit", "plainText", str)
self.contact = bind("contactCheckBox", "checked", bool)
def pushButton_1_Pressed(self):
print(self.nameEdit.text())
print(self.addressEdit.toPlainText())
print(self.contactCheckBox.isChecked())
def pushButton_2_Pressed(self):
self.nameEdit.setText('pippo')
self.addressEdit.clear()
self.addressEdit.insertPlainText('papero')
self.contactCheckBox.setChecked(True)
print(self.nameEdit.text())
print(self.addressEdit.toPlainText())
print(self.contactCheckBox.isChecked())
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
在将文本插入QLineEdit 或QTextEdit 或检查QCheckBox 小部件之后
您可以打印由bind 定义的变量,然后按第二个按钮同时更改变量值和小部件的文本/值(从Binding a PyQT/PySide widget to a local variable in Python 获得一些见解。
因为 Python 和 PyQt5 的内部对我来说很难知道,所以关于 bind 如何在三个小部件的代码中工作的防呆描述。
【问题讨论】:
-
你的问题不清楚
-
您是在问“绑定”是如何工作的吗?此外,您的代码无效: 1. 您尝试将绑定用作实例属性,但它们是 class 属性(查看第一个原始帖子中这些行的缩进级别关联); 2.该代码是针对PyQt4的,在PyQt5中,Qt属性默认返回已经转换为python对象,所以在getter中删除
.toPyObject(),在setter中将QVariant(value)更改为value; 3. 你没有使用这些绑定(如果你使用了,你的程序会因为上述问题而崩溃)。 -
@eyllanesc,您好已经有一段时间了...首先为什么 print(self.name) 给出
?实际上,属性与小部件的关系如何 -
@musicamante,谢谢老兄。我将尝试为 PyQt5 编辑它,看看是否能够管理类变量位,任何指向 PyQt5 的“将小部件属性绑定到 Python 变量”的链接
-
@pippo1980 你在问如何获取 all 属性的列表吗?据我所知,不可能从类中获取它,而只能从它的一个实例中获取,这可以通过他们的QMetaObject:
lineEdit = QLineEdit()meta = lineEdit.metaObject()for p in range(meta.propertyCount()):property = meta.property(p)来实现,它返回一个QMetaProperty 为该类定义的每个属性。
标签: python python-3.x binding pyqt pyqt5