python - 如何在 PyQt5/PySide2 中从一个类访问另一个类的属性

标签 python class pyqt5 pyside2

我无法访问属性 self.horizo​​ntalLayout_Base 在类里面 ui_MainWindow 我想在哪里添加新的小部件。
有 :

  • 主类 主窗口继承类 ui_MainWindow .
  • 类(class) ui_MainWindow 创建布局。
  • 类(class) 对话提供附加信息和确认或取消。

  • 主类 主窗口调用类对话 .类(class) 对话被查询然后方法表格小工具 在类里面主窗口叫做。但是无法访问属性 self.horizo​​ntalLayout_Base 这是由类 创建的ui_MainWindow .
    有什么办法可以访问吗?
    主类 MainWindow
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        
        def __init__(self, *args, obj=None, **kwargs):
            super(MainWindow, self).__init__(*args, **kwargs)
            
            ...
            
            self.setupUi(self)
            
            ...
            
            
        def tableWidget(self):
            if len(list) > 0:
                row = len(list)
                clmn = len(list[0]) 
                self.tableWidget = QTableWidget(row, clmn + 1)
            else:
                return
            self.vbox = QVBoxLayout()
    
            ...
    
            Ui_MainWindow.gridLayout_Base.addLayout(self.vbox) # Here I want to get access
    
    布局类 Ui_MainWindow
    class Ui_MainWindow(object):
    
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(1110, 772)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
            MainWindow.setSizePolicy(sizePolicy)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
            self.centralwidget.setSizePolicy(sizePolicy)
            self.centralwidget.setObjectName("centralwidget")
            self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
            self.gridLayout.setObjectName("gridLayout")
    
            self.horizontalLayout_Base = QtWidgets.QHBoxLayout() # This is target
    
            ...
    
    类对话
    class Dialog(QDialog):
    
        NumGridRows = 3
        NumButtons = 4
    
        def __init__(self, souradnice):
            super(Dialog, self).__init__()
            ...
    
        def buttonAccepted(self):
            ...
    
            MainWindow.tableWidget(self)
            self.close()
    
    

    最佳答案

    您似乎对什么是类、实例及其方法感到困惑(为此,我强烈建议您进行一些研究,因为它们是 OOP 的基本方面,不容忽视)。
    tableWidget您无法访问 gridLayout_Base来自 Ui_MainWindow ,因为那是一个类。由于您都继承自 QMainWindow 和 Ui_MainWindow,并且您正在调用 setupUi(self)这意味着 ui 的所有属性实际上都是作为 的属性成员创建的。实例 ,因此您只需使用 self.gridLayout_Base 即可访问布局.
    然后,如果要添加布局,则必须使用 addLayout() ,而不是 addWidget() (仅适用于小部件)。

        def tableWidget(self):
            # ...
            self.gridLayout_Base.addLayout(self.vbox)
    
    然后,我不知道您是如何创建和打开对话框的,但您当然不能调用 MainWindow.tableWidget(self) :这将导致使用对话框实例作为第一个参数(self)调用该方法,因此您不会向主窗口添加任何内容。
    一种更好、更安全的方法(这也是普遍接受的做法)是通过调用 exec() 将对话框显示为模态。 ,然后根据结果使用react。为了正确实现这一点,您不应调用 self.close()在对话框上(导致拒绝它)但是 self.accept() .
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        # ...
        def someFunctionToShowDialog(self):
            dialog = Dialog(self)
            if dialog.exec_():
                parameters = dialog.getValues()
                self.tableWidget()
                self.doSomethingWithParameters(parameters)
    
    
    class Dialog(QDialog):
        # ...
        def buttonAccepted(self):
            self.accept()
    
        def getValues(self):
            return self.someValue, self.anotherValue
    

    关于python - 如何在 PyQt5/PySide2 中从一个类访问另一个类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67181875/

    相关文章:

    使用单独(顺序)Python 进程的 Python Nose 单元测试

    class - 我如何在 Scala 中引用未实例化的类?

    python - 合并 2 个编辑视频而不使用 ffmpeg 保存它们

    Python-类中的字典未按预期运行

    python - 在 python 中使用 lxml 打印 html 实体

    C++ 'class myClass' 之后的名称指定什么?

    java - 需要一种方法来读取两个文件并使用扫描器类输出差异

    python - PyQt5 中的 QWebEngineView 和 QWidget

    python - 麻线上传区。得到错误 "is an invalid value for Version"

    python - 如何检查一列中的值是否等于另一列数据框中的值