Сбой QSqlQueryModel::clear() при использовании нескольких QSqlQueryModel в разных таблицах

В проекте PyQT5 я использую QSqlQueryModel в таблице "A" для заполнения ListView и QSqlRelationalTableModel в той же таблице, сопоставленной с некоторыми LineEdits. У меня также есть фильтр, который вызывает QSqlQueryModel::clear(), QSqlQueryModel::setQuery(), QSqlRelationalTableModel::setFilter() и QSqlRelationalTableModel::select(), чтобы изменить данные в ListView в соответствии с фильтром. Весь этот код находится в общем классе, который принимает некоторые параметры для настройки моделей в соответствии с таблицей, для которой мне нужна модель. Графическая часть также включена в класс. Таким образом, иерархия MainWindow имеет TableAWidget, который имеет TableAModel, который наследует GenericModel.

Это работает безупречно, если я использую только одну таблицу и один виджет.

Если я добавлю еще одну таблицу "B" (идентичную первому, только с другим именем) и другой виджет, который является идентичной копией первой, только ссылающейся на новую таблицу (поэтому у нас есть TableBWidget и TableBModel), фильтр в TableBWidget будет работать как положено но фильтр в TableAWidget падает на QSqlQueryModel::clear().

Некоторые вещи, которые нужно знать:

  • В виджетах ВСЕ члены кодируются как self.__variablename, поэтому не должно быть "статических" членов.
  • Есть некоторые переменные, которые не соответствуют стилю self.__, но они всегда локальны для функций.
  • Строка запроса с фильтром всегда в порядке и всегда отличается от TableAWidget и TableBWidget, поэтому, опять же, я не вижу никаких "статичных" вещей, происходящих вокруг.
  • в главном окне TableAWidget показывается перед TableBWidget. Если я переключаю эти два, поведение также переключается: фильтр TableAWidget работает и фильтр TableBWidget аварийно завершает работу. Таким образом, порядок отображения (который также является порядком инициализации и объявления) имеет значение.

Я действительно не знаю, что делать. Я хотел бы не использовать только QSqlRelationalTableModel, потому что я не могу использовать его с ListView, как я хочу, и TableView выглядит ужасно. Каждое предложение приветствуется.

1 ответ

Проблема была в отсутствующей "статической" переменной. Соединение с базой данных было переменной "instance" (с добавлением self.), Поэтому второй экземпляр сбрасывал соединение, которое уже было создано первым, вызывая сбой первого виджета при попытке подключения к базе данных.

Теперь я переместил обработчик соединения в тело основного класса и удалил "self". и все работает отлично.

Другие вопросы по тегам