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

标签 python binding pyside

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

我怎样才能做到以下几点。 1.在左侧 ListView 中显示派系/团队名称? 2. 当使用编辑文本创建新的团队名称时,它会更新左侧的 ListView 。 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_())

最佳答案

您可以利用 returnPressed() 来做到这一点在您的 NameListWidget 小部件中发出信号:

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

关于python - 使用python,绑定(bind)在pyside QListWidgets中显示对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418245/

相关文章:

python - 一页上的多个 plotly plots 没有子图

python - 使用 sqlalchemy 将字典列表批量复制到 postgres

python - 在 Python 中重新编码类似于 R ifelse 的变量

python - 我需要使用 pyinstaller 应用程序打包 MySQL 服务器/客户端吗?

python - PySide - 获取表中所有可见行的列表

python - 如何用 python 解析 multipart/x-mixed-replace 消息

c++ - 从零开始的 Lua/C++ 绑定(bind)

ios - 无法导入 robovm 绑定(bind)

c# - 在可绑定(bind)的 RichTexBox 中加载 rtf mvvm wpf

python - 向其他QThread发送消息