在 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 看起来很糟糕。每个建议都值得赞赏。