我有一個非常奇怪的錯誤,我似乎無法診斷。PyQt4 QSqlTableModel,QTableView間歇更新
我有一個使用QSqlTableModel在QTableView中顯示數據的PyQt4應用程序。我在一個孤立的程序中重複了這個錯誤,如下所示。當我運行該程序時,大多數單元格/列都是可編輯的並更改了數據庫。但是,由於某種原因(當我這次運行它時)第5行是不可編輯的。有問題的行似乎改變。
有沒有關於如何進一步調試的建議?我已經重寫了setData方法,它的行爲如預期。它傳遞新值,並且父級setData返回True;但是,數據庫不會更改,tableView將恢復爲舊數據。
編輯:懷疑這可能是一個PyQt4錯誤,我安裝了最新的PyQt4(4.10版)。這似乎並不能改變問題的行爲。我還注意到,我沒有包括我的數據庫類。我已經更新了代碼清單以包含數據庫類。它從配置文件中提取數據庫連接信息。基本上,它只是使用MySQL5服務器後端。
class Database:
def __init__(self, parent = None):
print "Opening database connection."
self.data = QtSql.QSqlDatabase.addDatabase("QMYSQL")
self.data.setHostName(parent.config.get('Database','mysql_server'))
self.data.setPort(int(parent.config.get('Database','mysql_port')))
self.data.setDatabaseName(parent.config.get('Database','mysql_database'))
self.data.setUserName(parent.config.get('Database','mysql_user'))
self.data.setPassword(parent.config.get('Database','mysql_pass'))
if not self.data.open() :
print "error opening database"
print self.data.lastError().text()
print "database init complete"
class Model(QtSql.QSqlTableModel):
def __init__(self, prjID, parent = None):
super(Model, self).__init__(parent)
self.setEditStrategy(QtSql.QSqlTableModel.OnRowChange)
self.setTable("Debug")
self.setFilter("PrjID = " + str(prjID))
if not self.select() :
print "error, ", self.lastError().text()
class Main(QtGui.QMainWindow) :
def __init__(self) :
QtGui.QMainWindow.__init__(self)
self.config = ConfigParser.ConfigParser()
self.config.read("default.cfg")
self.db = Database(self)
self.model = Model(39,self)
self.tableView = QtGui.QTableView(self)
self.tableView.setGeometry(0,0,4000,400)
self.tableView.setModel(self.model)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = Main() #QtGui.QMainWindow()
#ui = Ui_MainWindow()
#ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
這裏是我創建的調試表。正如你在上面看到的,我的後端數據庫是MySQL。我也許可以做一些錯誤的,我定義這個表的方式?:
CREATE TABLE IF NOT EXISTS `Debug` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`PrjID` int(11) DEFAULT NULL,
`WorkType` int(11) DEFAULT NULL,
`Qty` double DEFAULT NULL,
`UnitCost` double DEFAULT NULL,
`Note` varchar(256) DEFAULT NULL,
`ShowDetail` tinyint(1) NOT NULL,
`SubTotal` float DEFAULT NULL,
UNIQUE KEY `ID` (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=101 ;
--
-- Dumping data for table `Debug`
--
INSERT INTO `Debug` (`ID`, `PrjID`, `WorkType`, `Qty`, `UnitCost`, `Note`, `ShowDetail`, `SubTotal`) VALUES
(1, 37, 10, 66, 1, 'asdfasdf', 1, 66),
(2, 37, 7, 22, 2, 'asdfasdf', 1, 44),
(3, 37, 11, 11, 33, 'asdfasdf', 1, 363),
(4, 37, 7, 1, 10, 'asdfasdf', 1, 10),
(5, 37, 10, NULL, NULL, 'aa', 0, NULL),
(100, 39, 6, 8, 10, 'aa', 0, 80),
(6, 38, 10, 2151, 0.20000000298, NULL, 0, 430.2),
(7, 38, 27, 120.25, 0, '123', 1, 0),
(8, 38, 22, 5.69, 5, NULL, 0, 28.45),
(9, 38, 7, 3, 35, NULL, 1, 105),
(11, 39, 1, 6, 35, 'aa', 0, 210),
(12, 39, 17, 17.78842, 6.5, 'zz', 0, 115.625),
(13, 39, 27, 147.944803, 0, 'zz', 0, 0),
(14, 39, 28, 82.17064, 15, NULL, 0, 1232.56),
(15, 39, 30, 64.42334, 0, 'aa', 0, 0);