OpenPersitentEditor的PyQt5 TypeError

问题描述

大家好,我正在用PYQT5做一些考试准备,我从工作簿中的练习中创建了一个应用程序,其中必须使它显示课程列表,当您单击它们时,它会打开一个带有课程名称的消息框还有一个按钮,以便用户可以将课程添加到列表中。支持使用添加按钮在listWidget的最后一项上打开QlineEdit,因此用户可以编辑字段,但是我一直收到TypeError消息:

第67行,位于onAddButton中 self.mylistWidget.openPersistentEditor(self,modelItem) TypeError:openPersistentEditor(self,QListWidgetItem):参数1具有意外类型'UNISACourses'

import sys
from PyQt5.QtWidgets import (QListWidget,QLineEdit,QWidget,QMessageBox,QHBoxLayout,QAbstractItemView,QApplication,QVBoxLayout,QPushButton,QButtonGroup)
from PyQt5.QtCore import pyqtSlot
from PyQt5 import Qt,QtGui


class MyListWidget(QListWidget,QWidget):
    """
    Subclassed QListWidget to allow for the closing of open editors and other modifications
    """

    def __init__(self,parent=None):
        super().__init__(parent=parent)
        self.setSelectionMode(QAbstractItemView.ExtendedSelection)

    def keyPressEvent(self,event):
        if event.key() == Qt.Key_Return:
            print("Closing any persistent editor")
            self.closePersistentEditor(self.model().index(self.count() - 1))
        else:
            super().keyPressEvent(event)


class UNISACourses(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # Main Window Settings
        self.setGeometry(300,300,350,250)
        self.setwindowTitle('Courses')

        # Layout
        self.main_layout = QVBoxLayout(self)
        self.setLayout(self.main_layout)

        # Main Widget
        self.mylistWidget = MyListWidget()
        self.mylistWidget.addItems(["COS1511","COS1521","COS1512","MNB1512","INF1505","FAC1502"])
        self.main_layout.addWidget(self.mylistWidget)

        # Define a layout for the other buttons to exist in for flexibility with resizing
        self.btn_add = QPushButton("Add",clicked=self.onAddButton)
        self.btn_delete = QPushButton("Delete",clicked=self.onDeleteButton)
        hBox = QHBoxLayout()
        hBox.addWidget(self.btn_add)
        hBox.addWidget(self.btn_delete)
        self.main_layout.addLayout(hBox)

        # Define any additional behavior of the list
        self.mylistWidget.itemDoubleClicked.connect(self.onClicked)

    def onClicked(self,item):
        QMessageBox.information(self,"Info",item.text())

    @pyqtSlot()
    def onAddButton(self):
        """
        Opens a QLineEdit editor on the last item in the listwidget,allowing the user to edit the field.
        NOTE: The user must click outside of the editor field then press Enter in order to close the editor
        """
        self.mylistWidget.addItem('')
        modelItem = self.mylistWidget.model().index(self.mylistWidget.count() - 1)
        self.mylistWidget.openPersistentEditor(self,modelItem)

    @pyqtSlot()
    def onDeleteButton(self):
        for item in self.mylistWidget.selectedItems():
            self.mylistWidget.takeItem(self.mylistWidget.row(item))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = UNISACourses()
    ex.show()
    sys.exit(app.exec_())

解决方法

您正在将两个错误的参数(self和QModelIndex)传递给QListWidget.openPersistentEditor,该参数接受一个 QListWidgetItem。使用QListWidget.item方法获取项目。您还可以添加QListWidget.setCurrentItem,以便立即选择它并准备进行编辑。

def onAddButton(self):
    self.mylistWidget.addItem('')
    modelItem = self.mylistWidget.item(self.mylistWidget.count() - 1)
    self.mylistWidget.openPersistentEditor(modelItem)
    self.mylistWidget.setCurrentItem(modelItem)

此处已解决:

def keyPressEvent(self,event):
    if event.key() == Qt.Key_Return:
        print("Closing any persistent editor")
        self.closePersistentEditor(self.item(self.count() - 1))
    else:
        super().keyPressEvent(event)

Qt.Key_Return的Qt命名空间类也位于QtCore模块内部。

from PyQt5.QtCore import pyqtSlot,Qt
from PyQt5 import QtGui

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...