python-PyQt-QTableView不响应dataChanged信号?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-PyQt-QTableView不响应dataChanged信号?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2284字,纯文字阅读大概需要4分钟。
内容图文
![python-PyQt-QTableView不响应dataChanged信号?](/upload/InfoBanner/zyjiaocheng/690/ef397009c195484481640f5b7c46700a.jpg)
QSqlQueryModel是一个很棒的数据库模型,但它是只读的.所以我重写了它的setData()和flags()方法.现在,我可以从QTableView编辑数据库表
但是当我发出dataChanged()时,QTableView不会刷新自身,当我在QTableView中编辑文本框并单击其他位置时,新值成功写入数据库,但是文本框的值恢复为旧值.我必须重新选择整个表,表现确实很差…
为什么?
class StudentsTableModel(QtSql.QSqlQueryModel):
def __init__(self):
QtSql.QSqlQueryModel.__init__(self)
self.LockedColumns = []
def flags(self, index):
flags = QtSql.QSqlQueryModel.flags(self, index)
if index.column() not in self.LockedColumns:
flags |= QtCore.Qt.ItemIsEditable
return flags
def setData(self, index, value, role):
primary_key_index = self.index(index.row(), 0)
name = self.data(primary_key_index)
field = self.record().fieldName(index.column())
self.update(name, field, value)
self.dataChanged.emit(self.index, self.index)
# Why DataView isn't refresh automatically when
# a dataChanged signal emited? Force re-select...
self.select(self.week)
return True
def update(self, name, field, value):
query = QtSql.QSqlQuery()
sql = ("UPDATE student_info SET '%s' = '%s' WHERE 学生姓名 = '%s'"
% (field, value, name))
query.exec(sql)
def select(self, week):
self.week = week
sql = ("SELECT 学生姓名,第%s周,小组 FROM student_info" % (week))
self.setQuery(sql)
解决方法:
查看此模型如何为您工作:
class sqlTableModel(QSqlTableModel):
def __init__(self, parent=None):
super(sqlTableModel, self).__init__(parent)
def setData(self, index, value, role=Qt.EditRole):
if role == Qt.EditRole:
value = value.strip() if type(value) == str else value
return super(sqlTableModel, self).setData(index, value, role)
def flags(self, index):
itemFlags = super(sqlTableModel, self).flags(index)
if index.column() != 0:
return itemFlags | Qt.ItemIsEditable
return itemFlags ^ Qt.ItemIsEditable # First column not editable
代替setQuery来设置表,我在主类中将具有以下内容:
def setDatabase(self, nameDatabase):
self.database = QSqlDatabase.addDatabase("QSQLITE")
self.database.setDatabaseName(nameDatabase)
return self.database.open()
def setTable(self, nameTable):
self.model = sqlTableModel(self)
self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
self.model.setTable(nameTable)
self.model.select()
self.view.setModel(self.model)
def saveTable(self):
if self.model.submitAll():
return True
self.model.database().rollback()
return False
内容总结
以上是互联网集市为您收集整理的python-PyQt-QTableView不响应dataChanged信号?全部内容,希望文章能够帮你解决python-PyQt-QTableView不响应dataChanged信号?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。