python - 如何在 PyQt5 / PySide2 中从一个类访问另一个类的属性
问题描述
我无法访问要在 其中添加新小部件的Ui_MainWindow类中的属性self.horizo ntalLayout_Base。
有 :
- 继承类Ui_MainWindow的主类MainWindow。
- 类Ui_MainWindow创建布局。
- 类对话框提供额外的信息和确认或取消。
主类MainWindow调用类Dialog。查询Dialog类,然后调用MainWindow类中的tableWidget方法。但是无法访问由类 Ui_MainWindow 创建的属性self.horizo ntalLayout_Base。
有什么办法可以访问吗?
主类 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
from Ui_MainWindow
,因为那是一个类。由于您都从 QMainWindow和Ui_MainWindow 继承,并且您正在调用setupUi(self)
这意味着 ui 的所有属性实际上都是作为instance的属性成员创建的,因此您只需使用self.gridLayout_Base
.
然后,如果要添加布局,则必须使用addLayout()
,而不是addWidget()
(仅适用于小部件)。
def tableWidget(self):
# ...
self.gridLayout_Base.addLayout(self.vbox)
然后,我不知道您是如何创建和打开对话框的,但您当然不能调用MainWindow.tableWidget(self)
: 这将导致调用该方法并将对话框实例作为第一个参数(self),因此您不会向其中添加任何内容主窗口。
一种更好更安全的方法(这也是普遍接受的做法)是通过调用它来将对话框显示为模态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
推荐阅读
- c++ - 有没有其他方法可以在没有向量的情况下在 C++ 中填充数组
- assembly - 标签不一致地重新定义了 NASM
- android-studio - Android Studio ActivityMain.kt 没有从 activity-main.xml 中找到 TextView、Buttons 等的 ID
- javascript - Node.js javascript:通过多个键值减少对象数组
- javascript - 如何访问我的本地目录文件并在 adonis 5 返回 response.json
- r - ggplot boxplot 但盒子延伸到第 5 和第 95 个百分位数
- json - 使用 Filebeat 7.9.3 正确解析 k8s docker 容器 json 日志
- postgresql - 在从 CSV 进行 COPY 操作期间,无法用 null 替换破折号
- symfony - 如何记录所有 Guzzle 请求的响应时间
- api - 如何处理 REST 中的自定义操作?