我正试图用Python3.7和PyQt5编写一个小应用程序,但遇到了麻烦
我对Python很陌生,我对C++的知识接近0(零)。 最后,我的项目将有一个Tableview,其模型是链接到QSlite数据库表的QsqlTableModel
那张表由三列组成。我只想编辑第二列(索引1),它的值为0/1。在本专栏中,我想作为委托(但使用persisten编辑器)放置一个类似here的开关按钮来更新布尔值(最后应用程序将类似于ToDo列表)
但问题仅仅出现在一开始。我可以填充模型,视图可以正确显示表中的数据,格式可以(仅用于测试目的),但是当我尝试编辑数据时,它不会更改模型中的数据。编辑行中的所有值都会消失,并且行标题中会出现感叹号
这只出现在我重新实现数据方法时。如果我只重新实现flags方法,一切都可以
我肯定我犯了一个愚蠢的错误,但我找不到问题所在
这是我的密码
main.py
from MyClass import MyConnection, TableView, Model
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MyConnection('data22.db')
model = Model('tabella_di_test')
table = TableView(model)
table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
table.show()
sys.exit(app.exec())
MyClass.py
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
from PyQt5.QtWidgets import QTableView, QItemDelegate
from PyQt5.QtCore import Qt, QModelIndex, QRect, QAbstractTableModel, QVariant
from PyQt5.QtGui import QFont, QPainter, QPixmap
import typing
import sys
COL_DEL = 1 #column that receive delegate in the future
COL_ICON = 2
class MyConnection:
def __init__(self, name):
super(MyConnection, self).__init__()
self.db = QSqlDatabase().addDatabase("QSQLITE")
self.db.setDatabaseName(name)
if self.db.open():
print("Connection Opened...")
else:
sys.exit("Errore nella connessione al DB...")
class TableView(QTableView):
def __init__(self, model):
super(TableView, self).__init__()
self.setAlternatingRowColors(True)
self.setModel(model)
class Model(QSqlTableModel):
def __init__(self, name):
super(Model, self).__init__()
self.setTable(name)
self.select()
print(self.rowCount())
def flags(self, index: QModelIndex):
if not index.isValid():
print('Flags ==> Index is not valid!')
return QVariant()
if index.column() == COL_DEL:
print('Flags ==> Index({},{}) '.format(index.row(), index.column()))
return Qt.NoItemFlags | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable
else:
return Qt.NoItemFlags | Qt.ItemIsEnabled
def data(self, index: QModelIndex, role=None) -> typing.Any:
if not index.isValid():
print('Index is not valid!')
return QVariant()
if role == Qt.TextAlignmentRole:
return Qt.AlignCenter
if role == Qt.DisplayRole:
return super(Model, self).data(index, role)
if role == Qt.FontRole and index.column() == COL_DEL:
font = QFont()
font.setBold(True)
font.setPixelSize(16)
return font
class Delegate(QItemDelegate):
def __init__(self):
super(Delegate, self).__init__()
在这种情况下,无需实现自定义模型,只需使用带有自定义委托的QSqlTableModel即可:
相关问题 更多 >
编程相关推荐