簡體   English   中英

PyQT:對話框窗口上定義的QListWidgetItem不能從主窗口訪問

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

我使用PyQT設計了一個UI,並定義了兩個窗口(Main和Dialog)。 想法是在MainWindow上定義幾個按鈕,然后按此按鈕將打開一個包含列表的詳細信息窗口。 我假設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))

因此,在主代碼中,我以這種方式定義了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()'))

你能幫我嗎? 我猜想我對Windows的定義有很大的錯誤,但是找不到。 提前致謝。

您在這里犯了一個非常愚蠢的錯誤。 您需要更改: self.ventanaDet.listAlarmsActive.insertItem(row,listItem)更改為self.ventanaDet.ventanaDet.listAlarmsActive.insertItem(row,listItem)

你可能已經想通了什么錯,但仍然是錯誤的小描述是: - self.ventanaDet被初始化為Details和有另一個變量ventanaDetDetails這實際上是與初始化Ui_DetailWindow

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM