Сбой 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". и все работает отлично.