【问题标题】:How do I access a dynamic property in PyQt?如何访问 PyQt 中的动态属性?
【发布时间】:2014-02-19 03:06:33
【问题描述】:

我在 Designer 界面中创建了一个动态属性。如何在我的代码中访问此属性?

我没有看到以我提供的名称列出的任何属性。我找到了一个包含 QByteArray 对象和我提供的名称的 dynamicPropertyNames 属性,但我不知道如何访问我存储的数据(我也不知道这是否是查询的正确位置)。

谢谢!

【问题讨论】:

  • 如果您知道属性的名称,从documentation 听起来就像是使用QObject.property (self, str <name>) 方法来访问它。
  • 感谢您的回复。我刚刚对此进行了测试,它返回给我一个 QVariant 对象。过去我一直无法弄清楚这些事情。只是再次对它们进行了一些搜索,我尝试了 .toString 和 .toPyObject (动态属性设置为字符串),但都没有返回我存储的值。调用 .toString 返回一个空字符串。
  • 没关系。我是个白痴。正在查询错误的对象。谢谢!
  • 这能回答你的问题吗? Add custom attribute to QCheckBox widget

标签: python pyqt qt-designer


【解决方案1】:

只是因为我遇到了类似的问题并且原因不是对象错误:可以使用 toString() 访问属性的内容。

【讨论】:

    【解决方案2】:

    此答案仅供我自己参考,试图重现问题并回答。

    这里是 QtDesigner 为具有 DynamicPropierty 的主窗口生成的代码,

    main_win.py :
    
    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'main_win.ui'
    #
    # Created by: PyQt5 UI code generator 5.12.3
    #
    # WARNING! All changes made in this file will be lost!
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(270, 20, 261, 131))
            self.pushButton.setObjectName("pushButton")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 29))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            MainWindow.setProperty("Prova-proprieta", _translate("MainWindow", "valore_pp"))   ### here the dynamic property created in the Designer interface
            self.pushButton.setText(_translate("MainWindow", "PushButton"))
    
    

    这里我的代码打印动态属性的值,

    main.py :
    
    import sys
    
    from PyQt5 import QtWidgets, QtCore
    
    from PyQt5.QtWidgets import QPushButton
    
    from main_win import Ui_MainWindow
    
    
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self, *args, **kwargs):
            super(MainWindow, self).__init__(*args, **kwargs)
            self.setupUi(self)
            
            
            print('from inside init : ', self.property('Prova-proprieta'))
            
            
            self.pushButton.clicked.connect(self.pushButton_1_Pressed)
            
        
        def pushButton_1_Pressed(self):
            
            self.setProperty('Prova-proprieta', 'changed')  
            print('from PushButton : ', self.property('Prova-proprieta'))
            
            
    
    
    if __name__ == "__main__":
        
        app = QtWidgets.QApplication(sys.argv)
       
        window = MainWindow()
        
        print('from loop : ',window.property('Prova-proprieta'))
        
        window.show()
        
        sys.exit(app.exec_())
    

    让我知道它是否适合你

    【讨论】:

    • @musicamante 很抱歉打扰,你能检查一下我的回答有什么问题吗?然后 self.property('Prova-proprieta') 返回一个字符串,有没有办法以某种方式获取属性对象?
    猜你喜欢
    • 2018-07-03
    • 2021-12-05
    • 2021-09-23
    • 2019-09-01
    • 1970-01-01
    • 2011-06-15
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多