2013-03-07 104 views
0

我有一個非常奇怪的錯誤,我似乎無法診斷。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); 

回答

0

可能的闡釋:一些事情,我已經想通了。我認爲我的基本問題是我的表沒有定義主鍵。當我用PRIMARY KEY而不是UNIQUE KEY創建表時,問題就消失了。

就PyQt4而言,我也知道我需要通過使用QTableView的setColumnHidden方法而不是QSqlTableModel的removeColumn來隱藏列(如ID列)。一旦ID列(主鍵)被刪除,更新就會變得棘手。

我還確定,如果我使用的是一個視圖(授予該視圖必須可以根據MySQL的要求進行編輯),那我必須在QSqlTableModel中手動設置主鍵。例如:

pk = QtSql.QSqlIndex("cursName","idxName") 
pk.append(QtSql.QSqlField("ID")) 
self.setPrimaryKey(pk)