将小部件属性绑定到Python变量

2024-10-01 13:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

试图理解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如何在三个小部件的代码中工作的哑巴证明描述


Tags: 代码selfbind部件deftypebuttonprint
1条回答
网友
1楼 · 发布于 2024-10-01 13:28:14

您所指的文章试图使用QObject属性实现^{}

因为它是一个属性,所以不应该在类中声明它,而应该在方法级别作为类属性声明它。另一方面,代码必须更新,因为它是为PyQt4编写的,在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_())

相关问题 更多 >