-1

在 PyQT5 项目中,我在表“A”上使用 QSqlQueryModel 来填充 ListView 和映射到某些 LineEdits 的同一表上的 QSqlRelationalTableModel。我还有一个过滤器,它调用 QSqlQueryModel::clear()、QSqlQueryModel::setQuery()、QSqlRelationalTableModel::setFilter() 和 QSqlRelationalTableModel::select() 来根据过滤器更改 ListView 中的数据。所有这些代码都在一个通用类中,它接受一些参数来根据我需要模型的表来配置模型。图形部分也包含在一个类中。所以层次结构是 MainWindow 有一个 TableAWidget,它有一个继承 GenericModel 的 TableAModel。

如果我只使用一张桌子和一个小部件,这将完美无缺。

如果我添加另一个表“B”(与第一个表相同,只是名称不同)和另一个小部件,它是第一个仅引用新表的相同副本(所以我们有 TableBWidget 和 TableBModel),TableBWidget 中的过滤器按预期工作但是 TableAWidget 中的过滤器在 QSqlQueryModel::clear() 上崩溃。

一些事情要知道:

  • 在小部件中,所有成员都编码为 self.__variablename,因此不应该有“静态”成员。
  • 有些变量不遵循 self.__ 样式,但它们始终是函数的局部变量。
  • 带有过滤器的查询字符串总是可以的,并且总是与 TableAWidget 和 TableBWidget 不同,所以我再一次看不到任何“静态”的事情发生。
  • 在主窗口中,TableAWidget 显示在 TableBWidget 之前。如果我切换这两个行为也会切换:TableAWidget 的过滤器工作和 TableBWidget 的过滤器崩溃。所以显示的顺序(也是初始化和声明的顺序)才是最重要的。

我真的不知道该怎么办。我不想只使用 QSqlRelationalTableModel 因为我不能像我想要的那样将它与 ListView 一起使用,而且 TableView 看起来很糟糕。每个建议都值得赞赏。

4

1 回答 1

0

问题是缺少“静态”变量。与数据库的连接是一个“实例”变量(以 self 开头),因此第二个实例丢弃了第一个实例已经创建的连接,导致第一个小部件在尝试连接到数据库时崩溃。

现在我已经在主类主体中移动了连接处理程序并删除了“自我”。一切正常。

于 2018-11-16T07:41:06.300 回答