如何在 PyQt5 / PySide2 中从一个 class 访问属性到另一个 class
How to access attribut from one class to another class in PyQt5 / PySide2
我无法访问我想要的 class Ui_MainWindow 中的属性 self.horizontalLayout_Base添加新的小部件。
有:
- Main class MainWindow 继承了 class Ui_MainWindow.
- Class Ui_MainWindow 创建布局。
- 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
我无法访问我想要的 class Ui_MainWindow 中的属性 self.horizontalLayout_Base添加新的小部件。
有:
- Main class MainWindow 继承了 class Ui_MainWindow.
- Class Ui_MainWindow 创建布局。
- 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