PyQT:无法从 Main Window 访问 Dialog window 上定义的 QListWidgetItem

PyQT: QListWidgetItem defined on Dialog window cannot be access from Main Window

我使用 PyQT 设计了一个 UI,并定义了两个 windows(Main 和 Dialog)。这个想法是在 MainWindow 上定义几个按钮,当你按下它时,它会打开一个带有列表的细节 window。我假设 pyuic4 创建的代码没有任何问题,但无论如何我会把 Detail Window 的代码放在你可以看到定义的列表的地方:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_DetailWindow(object):
    def setupUi(self, DetailWindow):
        DetailWindow.setObjectName(_fromUtf8("DetailWindow"))
        DetailWindow.setWindowModality(QtCore.Qt.NonModal)
        DetailWindow.setEnabled(True)
        DetailWindow.resize(600, 650)
        DetailWindow.setLocale(QtCore.QLocale(QtCore.QLocale.English,     QtCore.QLocale.UnitedStates))
        self.btnClose = QtGui.QPushButton(DetailWindow)
        self.btnClose.setEnabled(True)
        self.btnClose.setGeometry(QtCore.QRect(480, 610, 110, 32))
        self.btnClose.setObjectName(_fromUtf8("btnClose"))
        self.label = QtGui.QLabel(DetailWindow)
        self.label.setGeometry(QtCore.QRect(20, 20, 111, 20))
        self.label.setObjectName(_fromUtf8("label"))
        self.listAlarmsActive = QtGui.QListWidget(DetailWindow)
        self.listAlarmsActive.setGeometry(QtCore.QRect(10, 50, 256, 192))
        self.listAlarmsActive.setObjectName(_fromUtf8("listAlarmsActive"))

        self.retranslateUi(DetailWindow)
        QtCore.QMetaObject.connectSlotsByName(DetailWindow)

    def retranslateUi(self, DetailWindow):
        DetailWindow.setWindowTitle(_translate("DetailWindow", "Details", None))
        self.btnClose.setText(_translate("DetailWindow", "Close", None))
        self.label.setText(_translate("DetailWindow", "Alarms activated", None))

所以,在主代码中,我这样定义细节 window 的 class:

class Detail(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)       
        self.ventanaDet = Ui_DetailWindow()
        self.ventanaDet.setupUi(self)        
        self.connect(self.ventanaDet.btnClose, QtCore.SIGNAL('clicked()'), QtCore.SLOT('close()'))

因此,在 MainWindow 的构造函数中,我这样做:

class Principal(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.ventana = Ui_MainWindow()
        self.ventana.setupUi(self)

        self.connect(self.ventana.btnExit, QtCore.SIGNAL('clicked()'), QtCore.SLOT('close()'))
        self.ventana.btnHvac.clicked.connect(self.showDetailHvac)
        self.ventana.btnCryo.clicked.connect(self.showDetailCryo)
        self.ventanaDet = None

    def showDetailHvac(self):
        if self.ventanaDet is None:
            self.ventanaDet = Detail()
        self.ventanaDet.setWindowTitle("HVAC Alarms Detail")
        alarmsHvac=[]
        alarmsHvac.append("HVAC Alarm1")
        alarmsHvac.append("HVAC Alarm2")
        for alarm in alarmsHvac:
            row=0
            listItem=QtGui.QListWidgetItem(alarm);
            self.ventanaDet.listAlarmsActive.insertItem(row,listItem)
            row=row+1
        self.ventanaDet.show() 

这是我在控制台上得到的错误:

Traceback (most recent call last):
  File "./aogAlarmPanel.py", line 37, in showDetailHvac
    self.ventanaDet.listAlarmsActive.insertItem(row,listItem)
AttributeError: 'Detail' object has no attribute 'listAlarmsActive'

当我更改构造函数(仅用于测试目的)并将数据放在上面时,它工作正常,但不是我的想法:

class Detail(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)

        self.ventanaDet = Ui_DetailWindow()
        self.ventanaDet.setupUi(self)

        alarmsHvac=[]
        alarmsHvac.append("HVAC Alarm1")
        alarmsHvac.append("HVAC Alarm2")
        for alarm in alarmsHvac:
            row=0
            listItem=QtGui.QListWidgetItem(alarm);
            self.ventanaDet.listAlarmsActive.insertItem(row,listItem)
            row=row+1

        self.connect(self.ventanaDet.btnClose, QtCore.SIGNAL('clicked()'), QtCore.SLOT('close()'))

你能帮帮我吗?我猜我在 windows 的定义上有一个巨大的错误,但我找不到它。提前致谢。

你在这里犯了一个非常愚蠢的错误。您需要更改:- self.ventanaDet.listAlarmsActive.insertItem(row,listItem)self.ventanaDet.ventanaDet.listAlarmsActive.insertItem(row,listItem).

您可能已经知道出了什么问题,但对该错误的简短描述仍然是:- self.ventanaDetDetails 初始化,Details 中还有另一个变量 ventanaDet 实际上用 Ui_DetailWindow.

初始化