首先,我对Python非常陌生 - 这是我编程的第二个月(使用PySide / SQLAlchemy仅几周)所以请保持温和。
我正在开发一个植物管理应用程序,并且有一个带有一堆复选框的表单,这些复选框与一年中播种的种子和另一堆表示种植区域的复选框相关。 我用QTDesigner开发了这个表单。
我正在收集对象名称和复选框的状态并将它们存储在字典中(使用复选框对象名称作为键,并将checkstate(true或fals)作为项目)然后将其存储在sqlite中db via sqlalchemy(使用PickleType作为列)。
我想从sqlite数据库中读取一条记录,并将所有复选框恢复为保存时所处的状态。
我的问题是dict中的键(复选框对象名称)是一个字符串。我无法弄清楚如何将其映射到复选框。
例如dict看起来像这样:
{'zone5bCB': True, 'zone3aCB': False, 'zone7bCB': True, 'zone1CB': True, 'zone3bCB': False, 'zone2bCB': False, 'zone9aCB': False, 'zone4aCB': False, 'zone6aCB': False, 'zone10aCB': False, 'zone6bCB': False, 'zone10bCB': False, 'zone11CB': True, 'zone2aCB': True, 'zone8bCB': False, 'zone8aCB': False, 'zone4bCB': True, 'zone9bCB': True, 'zone7aCB': False, 'zone5aCB': True}
其中键是对象名称。 所以,如果我想使用第一个键:dict中的项目:
self.zone5bCB.setCheckState(QtCore.Qt.Checked)
我有一种感觉,我必须做一个findchildren()将这些匹配到dict中的对象名称。或者我可能完全以错误的方式解决这个问题,我应该以另一种方式存储/恢复数据库中的复选框状态?
这是我刚刚从GUI类中显示相关方法的简要版本:
def getCBState(self, wid):
""" gets the state of all checkboxes on widget wid"""
returndict = dict()
CBs = wid.children()
for box in CBs:
if(isinstance(box, QtGui.QCheckBox)):
returndict[box.objectname()] = box.isChecked()
return returndict
def saveRecord(self):
""" reads data from all editable widgets and saves to db"""
# read checkboxes and store in dict's
zonesdict = self.getCBState(self.layoutWidget2)
sowseasondict = self.getCBState(self.layoutWidget7)
session = Session()
newplant = PlantInfo(refname=self.refNameEdit.text(),
botname = self.botNameEdit.text(),
zones = zonesdict,
sowseason = sowseasondict #saving dicts as Blobs
#lots more stuff is here but cut for this
)
def populateCBs(self, instance):
print(instance)
if instance:
for key, item in instance.items():
if item:
key.setCheckState(QtCore.Qt.Checked) #<-- doesn't work because key is string not a QCheckbox object
def displayDetails(self, current_id=0):
""" Display records inthe detailed form"""
session = Session()
for instance in session.query(PlantInfo).filter(PlantInfo.id == current_id):
self.clearAll()
#populate gen info tab
self.plantIdDisplay.setText(str(instance.id))
self.plantNameHeader.setText(instance.botname)
self.refNameEdit.setText(instance.refname)
self.botNameEdit.setText(instance.botname)
self.populateCBs(instance.zones)
self.populateCBs(instance.sowseason)
答案 0 :(得分:0)
我对PySide或GUI代码一般不太了解,但我认为我可以看到两种可能对您有意义的方法:
首先是制作一个与当前getCBStates
方法完全相反的方法:
def setCBState(self, wid, statedict):
""" sets the state of all checkboxes on widget wid"""
CBs = wid.children()
for box in CBs:
if isinstance(box, QtGui.QCheckBox) and statedict[box.objectname()]:
box.setCheckState(QtCore.Qt.Checked)
我的另一个想法是基于您当前的populateCBs
方法,它假定字典中的对象名称对应于当前对象的属性。它使用getattr
函数来访问属性:
def populateCBs(self, instance):
print(instance)
if instance:
for key, item in instance.items():
if item:
getattr(self, key).setCheckState(QtCore.Qt.Checked)
我不太了解你的代码,无法判断哪种方法更适合你,但我希望他们能指出你找到合适的方法。