0

我有一个非常奇怪的错误,我似乎无法诊断。

我有一个 PyQt4 应用程序,它使用 QSqlTableModel 在 QTableView 中显示数据。我在一个独立的程序中重复了这个错误,如下所示。当我运行程序时,大多数单元格/列都是可编辑的并更改数据库。但是,由于某种原因(这次我运行它时)第 5 行不可编辑。有问题的行似乎发生了变化。

关于如何进一步调试有什么建议吗?我已经覆盖了 setData 方法,它的行为符合预期。它传递新值,父 setData 返回 True;但是,数据库没有改变,tableView 恢复到旧数据。

编辑:怀疑这可能是 PyQt4 错误,我安装了最新的 PyQt4(4.10 版)。这似乎并没有改变问题的行为。我还注意到我没有包括我的数据库类。我已经更新了代码清单以包含 DB 类。它从配置文件中提取数据库连接信息。基本上,它只是使用 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);
4

1 回答 1

1

可能的解释:我想出的东西很少。我认为我的基本问题是我的表没有定义主键。当我使用 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)
于 2013-03-08T04:27:48.730 回答