【问题标题】:Binding widget properties to Python variables将小部件属性绑定到 Python 变量
【发布时间】: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_())


在将文本插入QLineEditQTextEdit 或检查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 属性的列表吗?据我所知,不可能从类中获取它,而只能从它的一个实例中获取,这可以通过他们的QMetaObjectlineEdit = QLineEdit()meta = lineEdit.metaObject()for p in range(meta.propertyCount()):property = meta.property(p) 来实现,它返回一个QMetaProperty 为该类定义的每个属性。

标签: python python-3.x binding pyqt pyqt5


【解决方案1】:

您所指的文章尝试使用 QObjects 属性实现python properties

因为它是一个属性,所以它不应该在类中声明,而是在方法级别作为类属性声明。另一方面,代码必须更新,因为它是为 PyQt4 编写的,其中从 python 到 Qt 的对象之间的转换不是隐式的,考虑到上述情况,解决方案是:

import sys

from PyQt5.QtCore import QObject
from PyQt5.QtWidgets import (
    QApplication,
    QWidget,
    QLineEdit,
    QTextEdit,
    QCheckBox,
    QFormLayout,
    QPushButton,
)


def bind(objectName, propertyName):
    def getter(self):
        return self.findChild(QObject, objectName).property(propertyName)

    def setter(self, value):
        self.findChild(QObject, objectName).setProperty(propertyName, value)

    return property(getter, setter)


class Window(QWidget):
    name = bind("nameEdit", "text")
    address = bind("addressEdit", "plainText")
    contact = bind("contactCheckBox", "checked")

    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)

        layout = QFormLayout(self)
        layout.addRow(self.tr("Name:"), self.nameEdit)
        layout.addRow(self.tr("Address:"), self.addressEdit)
        layout.addRow(self.tr("Receive extra information:"), self.contactCheckBox)

        layout.addWidget(self.button_1)
        layout.addWidget(self.button_2)

    def pushButton_1_Pressed(self):
        print(self.name)
        print(self.address)
        print(self.contact)

    def pushButton_2_Pressed(self):
        self.name = "pippo"
        self.address = ""
        self.address += "papero"
        self.contact = True
        print(self.address)
        print(self.contact)


if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

【讨论】:

  • 您好,关于如何理解 python 属性和小部件属性的任何提示?
  • @pippo1980 关于python属性请阅读我的帖子链接,关于Qt属性请阅读官方文档:doc.qt.io/qt-5/properties.html
  • 抱歉没有得到链接,现在我看到了,谢谢。 PyQt5 是官方在 github 上还是需要从河岸下载?
  • @pippo1980 PyQt 没有正式在 github 上(但是有非官方的仓库),无论如何你都应该使用 pip 安装它。
  • okeydokey,再次欢呼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多