select 添加到 python 后的 pyside listwidget 项

select pyside listwidget item after it's added in python

用户可以通过在文本输入中输入文本并按键盘上的回车键将新团队名称添加到列表中。

添加到列表后如何使它成为 select 项目?请记住,每次添加新项目时,我希望列表首先按字母顺序重新排序。我知道如何按字母顺序排序,只是不确定在代码中的什么位置。

以下代码中使用此代码段按字母顺序排序...

# sort list by attribute name
        teamList.sort(key=lambda x: x._name, reverse=False)

该代码包含一个 class 团队。这是代码...

 #!/usr/bin/python
# -*- coding: utf-8 -*-

"""
Info goes here...
"""

import sys
from PySide import QtGui, QtCore

# Variables
# ------------------------------------------------------------------------------
teamList = []


# Classes
# ------------------------------------------------------------------------------
"""
Base class of team which contains 2 properties
name - name of team
members - list of team member names
"""
class Team:
    """
    One line description...
    other info....
    """
    def __init__(self, name, members=None):
        self._name = name
        if members==None:
            self._members = []

    @property
    def name(self, value):
        # add type validation lines here
        self._name = value

    @property
    def members(self, value):
        # add type validation lines here
        self._members = value


# Base widget widget
# ------------------------------------------------------------------------------
"""
Base widget which contains 
label - describes widget
textedit - input field for appending items to list
listview - displays the list of items teams or members
"""
class NameListWidget(QtGui.QWidget):

    def __init__(self, title=None):
        super(NameListWidget, self).__init__()

        self.initUI()
        if title!=None:
            self.listLabel.setText(title)

    def initUI(self): 

        # formatting 
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle("Input List")

        # widgets
        self.listLabel = QtGui.QLabel("Label")
        self.nameInput = QtGui.QLineEdit()
        self.nameList = QtGui.QListWidget()

        # signals
        self.nameInput.returnPressed.connect(self.pressed_return)

        # layout
        self.mainLayout = QtGui.QVBoxLayout(self)
        self.mainLayout.setContentsMargins(0,0,0,0)
        self.mainLayout.addWidget(self.listLabel)
        self.mainLayout.addWidget(self.nameInput)
        self.mainLayout.addWidget(self.nameList)
        self.show()

    def pressed_return(self):
        txt = self.nameInput.text()
        # remove leading and trailing whitespaces
        txt = txt.strip()
        # replace all remaining spaces with underscores
        txt = txt.replace (" ", "_")

        if (len(txt) >= 1):
            self.nameList.addItem(txt)
            self.nameInput.clear()


# Main widget
# ------------------------------------------------------------------------------
"""
Main team widget contains two instances of the nameList widget
left widget - contains a list of the team names
right widget - contains list of members names for the selected team
"""
class TeamsWidget(QtGui.QWidget):

    def __init__(self):
        super(TeamsWidget, self).__init__()

        self.initUI()

    def initUI(self): 

        # formatting 
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle("Teams")

        # widgets
        self.teamsListWidget = NameListWidget("Teams")

        # layout
        self.mainLayout = QtGui.QHBoxLayout(self)
        self.mainLayout.addWidget(self.teamsListWidget)
        self.show()

        self.populateUI()

    def populateUI(self):
        A = Team("Zebras")
        B = Team("Donuts")
        C = Team("Characters")
        D = Team("50")
        teamList.append(A)
        teamList.append(B)
        teamList.append(C)
        teamList.append(D)

        # sort list by attribute name
        teamList.sort(key=lambda x: x._name, reverse=False)

        self.teamsListWidget.nameList.clear()
        for t in teamList:
            self.teamsListWidget.nameList.addItem(t._name)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ex = TeamsWidget()
    sys.exit(app.exec_())

这是一个示例,说明如何 select 来自最后输入文本的项目:

def pressed_return(self):
    txt = self.nameInput.text()
    # remove leading and trailing whitespaces
    txt = txt.strip()
    # replace all remaining spaces with underscores
    txt = txt.replace (" ", "_")

    if (len(txt) >= 1):
        self.nameList.addItem(txt)
        self.nameInput.clear()

    # EDITS HERE
    items = [self.nameList.item(i).text() for i in range( self.nameList.count() ) ] # Get text of all items
    if txt in items: # Check if text is in list
        index = items.index(txt) # Get text's index
        self.nameList.item(index).setSelected(True) # Select item

我们的想法是,它将获取每行文本的列表,获取新项目所在的行,然后 select 它。如果您希望它执行得更快,您可以在添加项目时保存项目的文本以跟踪它们。这样您就不需要在每次添加新项目时都从 table 中获取它。现在,如果您添加列表中已存在的文本,这将失败,因此您可能需要对此进行条件检查。

您必须重新排序您的脚本,以便在您向其中添加新项目时重新对项目进行排序(与现在在 populateUI 中相反)。