使用 python、绑定在 pyside QListWidgets 中显示对象列表?

display object lists in pyside QListWidgets using python, binding?

在我的主要派系小部件中,我有一个包含派系对象的列表。每个派系都有一个名字和团队成员的名字。我不确定绑定是否是理想的解决方案。如果是这样,我不确定如何进行绑定?

我怎样才能做到以下几点。 1.在左侧列表视图中显示faction/team个名字? 2. 当使用编辑文本创建新的团队名称时,它会更新左侧的列表视图。 3. 选择一个团队后,它会填充右侧的列表,显示团队成员的姓名。 4. 当用户输入新成员名称时,它会被添加到左侧选定的团队。

当前UI

目标UI

代码...

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

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

import sys
import core_models as models
from PySide import QtGui, QtCore

"""
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 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 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.sportsListWidget = NameListWidget("Teams")
        self.memebersListWidget = NameListWidget("Members")

        # layout
        self.mainLayout = QtGui.QHBoxLayout(self)
        self.mainLayout.setSpacing(10)
        self.mainLayout.setContentsMargins(10,10,10,10)
        self.mainLayout.addWidget(self.sportsListWidget)
        self.mainLayout.addWidget(self.memebersListWidget)
        self.show()

        self.populateUI()

    def populateUI(self):
        teamsList = ['packers', 'broncos', 'cowboys', 'steelers'];
        self.sportsListWidget.nameList.clear()
        for i in teamsList:
            self.sportsListWidget.nameList.addItem(i)  



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

您可以利用 NameListWidget 小部件中的 returnPressed() 信号来执行此操作:

initUI中:

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

然后创建pressed_return方法,还是在你的NameListWidget.

def pressed_return(self):
    self.nameList.addItem(self.nameInput.text())
    self.nameInput.clear()

这会将当前值添加到您的列表中,然后清除 QLineEdit