PyQt QListView在用户界面编辑项目后检索项目

Posted

技术标签:

【中文标题】PyQt QListView在用户界面编辑项目后检索项目【英文标题】:PyQt QListView retrieving item after item edited by user interface 【发布时间】:2014-01-20 19:28:36 【问题描述】:

我正在使用 Python 3.3 PyQt5。我有一个包含一些项目的 QListView 小部件。我想在用户双击项目并对其进行编辑时检索项目,以便将其新值保存到数据库中。但我找不到任何像编辑完成或有用的信号。

class MainWin(QtWidgets.QMainWindow):
    itemName = ""
    def __init__(self, inheritance=None):
        super(MainWin, self).__init__()
        self.ui=uic.loadUi("MainWin.ui", self)

        self.wordList = FileProc.WordStorage().readWordFile()

        self.showListView()
        self.itemName = ""

    def showListView(self, file = 'wordlist.db'):
        MainWin.wordList = FileProc.WordStorage().readWordFile(file)

        model = QtGui.QStandardItemModel(self.listView)

        for row in MainWin.wordList:
            item = QtGui.QStandardItem(row)
            model.appendRow(item)

        self.listView.setModel(model)

    def editWord(self):
        itemIndex = self.listView.selectedIndexes()
        MainWin.itemName = itemIndex[0].data()

我以这种方式显示列表。我想用 editWord() 方法检索编辑过的单词。 listView 中的项目更改后如何执行 editWord()?

【问题讨论】:

发布您的代码以查看您尝试了什么 【参考方案1】:

当我使用模型视图编程时,我宁愿做什么。是制作模型而不是使用默认模型。

class ListMOdel(QtCore.QAbstractListModel):
    def __init__(self , data=[] ,parent=None):
        QtCore.QAbstractListModel.__init__(self,parent)
        self.__data=data

    def rowCount(self ,parent):
        return len(self.__data)

    def data(self,index,role):

        if role == QtCore.Qt.DisplayRole:
            row=index.row()
            value = self.__data[row]
            return value

    def flags(self,index):
        return QtCore.Qt.ItemIsEditable |QtCore.Qt.ItemIsEnabled| QtCore.Qt.ItemIsSelectable

    def setData(self,index,value,role=QtCore.Qt.EditRole):
        if role == QtCore.Qt.EditRole:
            row= index.row()
            self.__data[row]=value
            return True
        return False

class MainWin(QtWidgets.QMainWindow):
    itemName = ""
    def __init__(self, inheritance=None):
        super(MainWin, self).__init__()
        self.ui=uic.loadUi("MainWin.ui", self)

        self.wordList = FileProc.WordStorage().readWordFile()

        self.showListView()
        self.itemName = ""

    def showListView(self, file = 'wordlist.db'):
        MainWin.wordList = FileProc.WordStorage().readWordFile(file)
        data=[]
        for row in MainWin.wordList:
            data.append(row)

        model = ListMOdel(data)
        self.listView.setModel(model)

这是自定义模型的示例。 setData 函数更新值。

【讨论】:

'return value.name()' 在 data() 方法中给出 AttributeError。为什么 .name() 在那里使用? 好的,但是,当用户在界面内编辑列表中的项目时,我不知道如何使用它。我在设置数据时没有遇到困难我的问题是当用户界面更改项目的值时我找不到正确的信号或类似的信号。 @tugyan :你想对信号做什么。可能会听到捕获信号,但文档指出以下“如果成功设置数据,则应发出 dataChanged() 信号。”。

以上是关于PyQt QListView在用户界面编辑项目后检索项目的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4 - 在 QListView 中的项目上按下 Enter 键

PyQt:QListView 拖放重新排序信号问题

PyQt5 QListView 拖放创建新的隐藏项

PyQt QListView 拖放问题,用于在一个列表中导入和重新排列

PyQt5-高级控件使用(QListView)

PyQt5 组件之QListView