Сбой QSqlQueryModel :: clear () при использовании нескольких QSqlQueryModel в разных таблицах - PullRequest
0 голосов
/ 15 ноября 2018

В проекте 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 Ответ

0 голосов
/ 16 ноября 2018

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

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

...