簡體   English   中英

如何在 PyQt5 / PySide2 中訪問從一個 class 到另一個 class 的屬性

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

我無法訪問 class Ui_MainWindow 中的屬性self.horizo ntalLayout_Base ,我想在其中添加新的小部件。

有:

  1. 主 class MainWindow繼承 class Ui_MainWindow
  2. Class Ui_MainWindow創建布局。
  3. Class對話框提供附加信息和確認或取消。

主 class MainWindow調用 class Dialog Class Dialog被查詢,然后調用class MainWindow中的tableWidget方法。 但是無法訪問由 class Ui_MainWindow 創建的屬性self.horizo ntalLayout_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

布局 class 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 對話框

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 ,您無法從Ui_MainWindow訪問gridLayout_Base ,因為那是 class。 由於您都繼承自 QMainWindowUi_MainWindow,並且您正在調用setupUi(self)這意味着 ui 的所有屬性實際上都是作為instance的屬性成員創建的,因此您只需使用self.gridLayout_Base即可訪問布局.
然后,如果要添加布局,則必須使用addLayout() ,而不是addWidget() (僅適用於小部件)。

    def tableWidget(self):
        # ...
        self.gridLayout_Base.addLayout(self.vbox)

然后,我不知道您是如何創建和打開對話框的,但您當然不能調用MainWindow.tableWidget(self) :這將導致以對話框實例作為第一個參數(self)調用該方法,所以您贏了不要在主 window 中添加任何內容。

一種更好、更安全的方法(這也是普遍接受的做法)是通過調用其exec()將對話框顯示為模態,然后根據結果對其做出反應。 為了正確實現這一點,您不應該在對話框上調用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM