Attribute Error: object has no attribute error -- subclassing GUI PyQt4
Attribute Error: object has no attribute error -- subclassing GUI PyQt4
我添加了一个新的模态对话框,只要用户想要删除行,它就会要求输入密码。我使用 Qt Designer 创建了 GUI。我无法在我的 GUI 中调用 inventoryTable。
每次我调用 secureDelete 函数时,都会出现属性错误,提示“'MainWindow_ui' 对象没有属性 'inventoryTable'”。
谁能告诉我如何正确添加其他 UI,并且以后还能避免此属性错误?
class Main(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.db = Database()
self.model = Model(self)
self.ui = MainWindow_ui()
self.ui.setupUi(self)
self.ui.removeItem.clicked.connect(lambda: self.start_Secure())
self.ui.removeItem.setShortcut("Del")
def start_Secure(self):
self.accessForm = confirmDialog(self)
self.accessForm.show()
class confirmDialog(QtGui.QDialog):
def __init__(self, parent=None):
super(confirmDialog, self).__init__(parent)
self.model = Model()
self.access_ui = Ui_Access()
self.access_ui.setupUi(self)
self.ui = MainWindow_ui()
self.access_ui.username.returnPressed.connect(self.secureDelete)
self.access_ui.password.returnPressed.connect(self.secureDelete)
self.access_ui.confirmButton.clicked.connect(self.secureDelete)
def secureDelete(self):
members = {'user': 'password'}
username = self.access_ui.username.text()
password = self.access_ui.password.text()
if username in members:
enteredPass = members.get(username)
indices = self.ui.inventoryTable.selectionModel().selectedRows()
if password == enteredPass:
for index in sorted(indices):
self.model.removeRow(index.row())
else:
self.model.revertRow(indices)
Qt Designer 生成的 类 提供了 setupUi()
方法来创建设计元素,因此在您的情况下您没有调用它,因此永远不会创建 inventoryTable
,但即使使用该函数传递它也无法实现您的目标,因为您将创建一个新实例。
在您的特定情况下,您已作为 confirmDialog
的父级传递给自己:
self.accessForm = confirmDialog(self)
然后您可以通过 parent()
方法访问 Main 在您的情况下执行以下操作:
class confirmDialog(QtGui.QDialog):
def __init__(self, parent=None):
[...]
self.access_ui.setupUi(self)
# self.ui = MainWindow_ui()
[...]
def secureDelete(self):
[...]
if username in members:
enteredPass = members.get(username)
indices = self.parent().ui.inventoryTable.selectionModel().selectedRows()
[...]
我添加了一个新的模态对话框,只要用户想要删除行,它就会要求输入密码。我使用 Qt Designer 创建了 GUI。我无法在我的 GUI 中调用 inventoryTable。
每次我调用 secureDelete 函数时,都会出现属性错误,提示“'MainWindow_ui' 对象没有属性 'inventoryTable'”。
谁能告诉我如何正确添加其他 UI,并且以后还能避免此属性错误?
class Main(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.db = Database()
self.model = Model(self)
self.ui = MainWindow_ui()
self.ui.setupUi(self)
self.ui.removeItem.clicked.connect(lambda: self.start_Secure())
self.ui.removeItem.setShortcut("Del")
def start_Secure(self):
self.accessForm = confirmDialog(self)
self.accessForm.show()
class confirmDialog(QtGui.QDialog):
def __init__(self, parent=None):
super(confirmDialog, self).__init__(parent)
self.model = Model()
self.access_ui = Ui_Access()
self.access_ui.setupUi(self)
self.ui = MainWindow_ui()
self.access_ui.username.returnPressed.connect(self.secureDelete)
self.access_ui.password.returnPressed.connect(self.secureDelete)
self.access_ui.confirmButton.clicked.connect(self.secureDelete)
def secureDelete(self):
members = {'user': 'password'}
username = self.access_ui.username.text()
password = self.access_ui.password.text()
if username in members:
enteredPass = members.get(username)
indices = self.ui.inventoryTable.selectionModel().selectedRows()
if password == enteredPass:
for index in sorted(indices):
self.model.removeRow(index.row())
else:
self.model.revertRow(indices)
Qt Designer 生成的 类 提供了 setupUi()
方法来创建设计元素,因此在您的情况下您没有调用它,因此永远不会创建 inventoryTable
,但即使使用该函数传递它也无法实现您的目标,因为您将创建一个新实例。
在您的特定情况下,您已作为 confirmDialog
的父级传递给自己:
self.accessForm = confirmDialog(self)
然后您可以通过 parent()
方法访问 Main 在您的情况下执行以下操作:
class confirmDialog(QtGui.QDialog):
def __init__(self, parent=None):
[...]
self.access_ui.setupUi(self)
# self.ui = MainWindow_ui()
[...]
def secureDelete(self):
[...]
if username in members:
enteredPass = members.get(username)
indices = self.parent().ui.inventoryTable.selectionModel().selectedRows()
[...]