需要你的帮助:
在我的测试设置中,表只包含一行。
res = self.setData(self.index(0, 1), numRows )
按预期执行并更新表。
res = self.setData(self.index(1, 1), numRows )
必须失败,因为要更新的行不存在。res是预期的FALS,但在cmd行上我得到:
model ErrT : 0
model Err text : ||
db ErrT : 0
db Err text : ||
Somwhow
modelError = self.lastError()
失败,我没有得到正确的信息回来,但我不明白为什么:-(
完整代码:
from Singleton.Singleton import Singleton
class ProcessorModel(QSqlTableModel, metaclass=Singleton):
def __init__(self, parent=None):
self.fileNamePath = ''
self.fileVersion = ''
# open database
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("processorModel.sqlite")
if not self.db.open():
logging.error(self.__className+ '.__init__ cannot open db')
super().__init__()
# make sure tables are there
self.rib_M = self.RibModel()
self.wing_M = self.WingModel()
def isValid( self, fileName ):
def setFileName( self, fileName ):
def openFile(self):
def readFile(self):
def remTabSpace(self, line):
def remTabSpaceQuot(self, line):
class WingModel(QSqlTableModel, metaclass=Singleton):
def createWingTable(self):
def __init__(self, parent=None):
def syncData(self, q):
class RibModel(QSqlTableModel, metaclass=Singleton):
__className = 'RibModel'
RibNumCol = 1
xribCol = 2
yLECol = 3
yTECol = 4
xpCol = 5
zCol = 6
betaCol = 7
RPCol = 8
WashinCol = 9
def createRibTable(self):
logging.debug(self.__className+'.createRibTable')
query = QSqlQuery()
query.exec("DROP TABLE if exists Rib;")
query.exec("create table if not exists Rib ("
"ID INT PRIMARY KEY,"
"RibNum varchar(50),"
"xrib varchar(50),"
"yLE varchar(50),"
"yTE varchar(50),"
"xp varchar(50),"
"z varchar(50),"
"beta varchar(50),"
"RP varchar(50),"
"Washin varchar(50));")
query.exec("INSERT into Rib (ID) Values( '1' );")
def __init__(self, parent=None):
'''
:method: Constructor
'''
super().__init__()
self.createRibTable()
self.setTable("Rib")
self.select()
self.setEditStrategy(QSqlTableModel.OnFieldChange)
def setupNumRibs(self, halfNumRibs):
logging.debug(self.__className+'.setupNumRibs')
numRows = self.rowCount()
res = self.setData(self.index(1, 1), numRows )
if not res:
modelError = self.lastError()
print('model ErrT : %s' %modelError.type())
print('model Err text : |%s|' %modelError.text())
print()
procM = ProcessorModel()
dbError = procM.db.lastError()
print('db ErrT : %s' %dbError.type())
print('db Err text : |%s|' %dbError.text())
print()
单例类可以在这里找到
如果你阅读文档,就会发现这并不神秘:
QSqlError QSqlQueryModel::lastError() const
返回有关最后一次错误的信息数据库。
很明显,lastError()表示与数据库交互时发生的错误,但在您的情况下,它不会交互,因为模型首先验证QModelIndex是有效的,并且由于您的QModelIndex无效,因此它立即返回false,而不与数据库进行任何事务。
另一方面,不要通过添加Singleton或其他只是噪音的元素来使问题复杂化。建议您为每个问题创建一个只关注问题的MRE,从而节省我们帮助您的时间,而不是必须消除愚蠢的代码。