如何在 PyQt5 / PySide2 中从一个 class 访问属性到另一个 class

How to access attribut from one class to another class in PyQt5 / PySide2

我无法访问我想要的 class Ui_MainWindow 中的属性 self.horizontalLayout_Base添加新的小部件。

有:

  1. Main class MainWindow 继承了 class Ui_MainWindow.
  2. Class Ui_MainWindow 创建布局。
  3. Class 对话框 提供附加信息和确认或取消。

Main class MainWindow 调用 class Dialog。 Class Dialog 查询然后 tableWidget in class MainWindow 方法叫做。但是无法访问由 class Ui_MainWindow.[=15 创建的属性 self.horizontalLayout_Base =]

有什么方法可以访问吗?

主class主窗口

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

布局classUi_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对话框

class Dialog(QDialog):

    NumGridRows = 3
    NumButtons = 4

    def __init__(self, souradnice):
        super(Dialog, self).__init__()
        ...

    def buttonAccepted(self):
        ...

        MainWindow.tableWidget(self)
        self.close()

您似乎混淆了 classes、实例及其方法(为此,我强烈建议您做一些研究,因为它们是 OOP 的基本方面,不容忽视) .

tableWidget 中,您无法从 Ui_MainWindow 访问 gridLayout_Base,因为那是 class。由于你们都继承自 QMainWindow Ui_MainWindow,并且你正在调用 setupUi(self),这意味着实际上创建了 ui 的所有属性作为 实例 的属性成员,因此您只需使用 self.gridLayout_Base.
即可访问布局 然后,如果您要添加布局,则必须使用 addLayout(),而不是 addWidget()(仅适用于小部件)。

    def tableWidget(self):
        # ...
        self.gridLayout_Base.<b>addLayout</b>(self.vbox)

那么,我不知道你是如何创建和打开对话框的,但你肯定不能调用 MainWindow.tableWidget(self):那会导致用 dialog 实例作为第一个参数(自身),因此您不会向主 window.

添加任何内容

一个更好更安全的方法(这也是普遍接受的做法)是通过调用它的 exec() 将对话框显示为模态,然后根据结果对其做出反应。为了正确实现这一点,您不应在对话框中调用 self.close()(这会导致 拒绝 它),而应调用 self.accept().

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    # ...
    def someFunctionToShowDialog(self):
        dialog = Dialog(self)
        if <b>dialog.exec_()</b>:
            parameters = dialog.getValues()
            self.tableWidget()
            self.doSomethingWithParameters(parameters)


class Dialog(QDialog):
    # ...
    def buttonAccepted(self):
        <b>self.accept()</b>

    def getValues(self):
        return self.someValue, self.anotherValue