我无法访问属性 self.horizontalLayout_Base 在类里面 ui_MainWindow 我想在哪里添加新的小部件。
有 :
主类 主窗口调用类对话 .类(class) 对话被查询然后方法表格小工具 在类里面主窗口叫做。但是无法访问属性 self.horizontalLayout_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/