【问题标题】:PyQT: QListWidgetItem defined on Dialog window cannot be access from Main WindowPyQT:在对话框窗口上定义的 QListWidgetItem 不能从主窗口访问
【发布时间】:2015-04-14 12:19:22
【问题描述】:

我使用 PyQT 设计了一个 UI,并定义了两个窗口(主窗口和对话框)。这个想法是在 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()'))

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

【问题讨论】:

    标签: python pyqt qlistwidget


    【解决方案1】:

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

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

    【讨论】:

    • 你是厕所。在这种情况下,我建议您更改变量名称以避免混淆。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多