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

时间:2015-10-29 15:22:58

标签: python binding pyside

在我的主要Faction Widget中,我有一个包含Faction Objects的列表。每个派系都有一个名称和团队成员名称。我不确定绑定是否是理想的解决方案。如果是这样我不知道怎么做绑定?

我该怎么做? 1.在左侧列表视图中显示派系/团队名称? 2.使用editext创建新的团队名称时,它会更新左侧的列表视图。 3.选择一个团队后,它会填充显示团队成员名称的右侧列表。 4.当用户输入新的成员名称时,它会被添加到左侧的选定团队中。

当前用户界面

enter image description here

目标用户界面

enter image description here

代码......

#!/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_())

1 个答案:

答案 0 :(得分:1)

您可以使用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

Example