在不同的表上使用多个QSqlQueryModel时,QSqlQueryModel :: clear()崩溃

时间:2018-11-15 08:41:19

标签: python pyqt pyqt5 qsqlquerymodel

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

如果我只使用一个表和一个小部件,这将完美地工作。

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

一些事情要知道:

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

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

1 个答案:

答案 0 :(得分:0)

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

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