使用 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
。
在我的主要派系小部件中,我有一个包含派系对象的列表。每个派系都有一个名字和团队成员的名字。我不确定绑定是否是理想的解决方案。如果是这样,我不确定如何进行绑定?
我怎样才能做到以下几点。 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
。