4 / 4 / 0
Регистрация: 02.07.2019
Сообщений: 26
1

Как обратиться к исходной модели моего класса из прокси-модели в pyqt5?

16.11.2022, 16:43. Показов 571. Ответов 4

Студворк — интернет-сервис помощи студентам
У меня есть модель my_model класса MyModelClass(QAbstractTableModel), у которой есть переменная класса columns. Я подключаю эту модель к прокси-модели my_proxy_model класса MyProxyModelClass(QSortFilterProxyModel) следующим образом:
Python
1
2
3
my_model = MyModelClass()
my_proxy_model = MyProxyModelClass()
my_proxy_model.setSourceModel(my_model)
Я хочу обратиться к переменной columns из my_proxy_model. Для этого я обращаюсь к исходной модели: my_proxy_model.sourceModel(), но вместо MyModelClass я получаю класс QAbstractItemModel, который не содержит переменной columns. Я понимаю почему это происходит, но не знаю как это обойти. Как я могу обратиться к переменной columns исходной модели класса MyModelClass из прокси-модели?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2022, 16:43
Ответы с готовыми решениями:

Цепочка из прокси-моделей. Как добыть индекс исходной модели?
Имеется цепочка из модели и нескольких прокси-моделей. Существует ли не очень геморройный способ...

Обратиться к полю модели, изменить и сохранить ее в своем методе класса Django CBV
Привет. Я хочу создать свой метод в классе представления DetailView и обратиться к полю модели,...

Как сохранить фокус в TextField после перезагрузки модели в PyQt5 QML QtQuick
Rectangle { ListView { id: listView delegate: Item { id:...

Как создать скелет для stl модели по точкам поверхности модели?
нужно придумать алгоритм, чтобы автоматически создавался скелет для stl модели по точкам...

4
1427 / 672 / 299
Регистрация: 02.05.2020
Сообщений: 1,534
16.11.2022, 21:03 2
хмм... у меня работает:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *
 
class MyModelClass(QAbstractTableModel):
  def __init__(self):
    super().__init__()
    self.columns = 10
 
class MyProxyModelClass(QSortFilterProxyModel):
  pass
        
if __name__ == '__main__':
  app = QApplication(sys.argv)
  my_model = MyModelClass()
  my_proxy_model = MyProxyModelClass()
  my_proxy_model.setSourceModel(my_model)
  print(my_proxy_model.sourceModel().columns)
1
4 / 4 / 0
Регистрация: 02.07.2019
Сообщений: 26
16.11.2022, 22:16  [ТС] 3
Да, действительно, если попробовать извлечь переменную класса MyModelClass из модели, полученной с помощью sourceModel(), то это может получиться. Но полученная с помощью sourceModel() модель имеет класс QAbstractItemModel. Если посмотреть описание sourceModel(), то мы увидим, что тип возвращаемого значения имеет аннотацию как QAbstractItemModel. Соответственно, мы не может гарантировать, что при получении переменной columns не возникнет ошибки.
Может быть, я недостаточно хорошо знаю наследование или приведение типов в python, и получение переменной класса таким образом является правильным, но моя среда разработки pycharm ругается на my_proxy_model.sourceModel().columns (хоть и проглатывает). Мне кажется, что должно быть какое-то простое решение, которое бы исключило эту неопределённость с типом модели.
0
1427 / 672 / 299
Регистрация: 02.05.2020
Сообщений: 1,534
17.11.2022, 11:07 4
Лучший ответ Сообщение было отмечено FerruSea как решение

Решение

Цитата Сообщение от FerruSea Посмотреть сообщение
тип возвращаемого значения имеет аннотацию как QAbstractItemModel. Соответственно, мы не может гарантировать, что при получении переменной columns не возникнет ошибки.
Насколько я понимаю, это утверждение однозначно справедливо для C++. В Python немного иначе:
Python
1
2
3
  source = my_proxy_model.sourceModel()
  print(isinstance(source, QAbstractTableModel))
  print(isinstance(source, MyModelClass))
В моём случае оба раза true
Среда разработки справедливо ругается, потому что она знает только описание QAbstractTableModel
1
4 / 4 / 0
Регистрация: 02.07.2019
Сообщений: 26
17.11.2022, 16:12  [ТС] 5
Спасибо, что помогли разобраться. Среда разработки ругалась напрасно. Если проверить тип класса, возвращаемого sourceModel() следующим образом:
Python
1
2
3
source = my_proxy_model.sourceModel()
print(type(source) is QAbstractTableModel)
print(type(source) is BondsModelClass)
, то выведет False и True соответственно. Таким образом, можно убедиться, что возвращается именно MyModelClass, чего я и хотел.

Добавлено через 9 минут
isinstance() возвращает True в обоих случаях потому, что поддерживает наследование, а MyModelClass является наследником QAbstractItemModel и QAbstractTableModel, поэтому в данном случае лучше использовать прямое сравнение.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2022, 16:12
Помогаю со студенческими работами здесь

Как вытащить значение поля модели внутри самой модели
Здравствуйте. При написании моего проекта возник следующий вопрос. Имеется модель: class...

Как использовать представление одной модели в представлении другой модели?
Добрый день! Хотел бы узнать как использовать представление одной модели в представлении другой...

Как в Yii обращаться с текущей модели из базовой модели?
Есть Базовая, модель со всякими типичными действиями. Со статическими методами разобрался, к...

Сортировка в прокси-модели
Есть модель, представление и сортирующая прокси-модель. И модели и представление имеют иерархию в...

Индексы в прокси модели
Здравствуйте Столкнулся с такой проблемой: Если ячейка редактируется в момент обновления...

Обновление прокси-модели и ее представления
Добрый день. Есть TreeView, который является представлением прокси-модели QSortFilterProxyModel....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru