PyQT:在对话框窗口中定义的QListWidgetItem无法从主窗口访问

时间:2015-04-14 03:54:46

标签: python pyqt qlistwidget

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

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))

因此,在主代码中,我以这种方式定义了Detail窗口的类:

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()'))
你能帮帮我吗?我猜我在窗口的定义上有一个巨大的错误,但我找不到它。提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

您可能已经弄清楚什么是错的,但仍然有一个小错误描述如下: - self.ventanaDet初始化为DetailsventanaDet中还有另一个变量Details,实际上已使用Ui_DetailWindow初始化。