17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 497
1
PySide

QML: Странный глюк в моей модели ?

15.02.2021, 18:11. Показов 1367. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую, всезнающий All !

Когда из qml вызывается функция setData, она, почему-то, меняет не только self._items но и self._all_items ! Но это ведь разные списки - не пойму как так то ?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class cl_List_model(QAbstractListModel):
    def __init__(self, items, parent=None):
        QAbstractListModel.__init__(self, parent)
        self._items = items
        self._all_items = items[:]
        self._search_str = ''
 
    def roleNames(self):
        return {Qt.UserRole + 0: QByteArray(b'item_name'), Qt.UserRole + 1: QByteArray(b'item_selected')}
 
    def rowCount(self, parent=None):
        return len(self._items)
 
    def data(self, index, role=None):
        role = role or QModelIndex()
        if role == Qt.UserRole + 0:
            return self._items[index.row()]['item_name']
        if role == Qt.UserRole + 1:
            return self._items[index.row()]['item_selected']
 
    def setData(self, index, val, role=Qt.UserRole + 1):
        if role == Qt.UserRole + 1:
            self._items[index.row()]['item_selected'] = not self._items[index.row()]['item_selected']
            self.dataChanged.emit(index, index, Qt.UserRole + 1)
            return True
        return False
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2021, 18:11
Ответы с готовыми решениями:

Странный глюк
Есть небольшая база, самая простая форма в поле которой храниться несколько аттачментов. Доступ у...

Странный глюк
Может кто-нибудь сталкивался? Есть БД, в основе интерфейса фрейм, в одной половине, которого...

Странный глюк
Вроде-бы ни каких процессов нет а проц всё равно загружен а 30%. Знает кто что это такое?

Странный Глюк
Приветствую всех! Недавно появился странный глюк на компе. Ползунки для прокрутки страниц и...

2
Автоматизируй это!
Эксперт Python
7107 / 4610 / 1215
Регистрация: 30.03.2015
Сообщений: 13,236
Записей в блоге: 29
15.02.2021, 18:31 2
Лучший ответ Сообщение было отмечено BVladimir2 как решение

Решение

BVladimir2, глюки бывают редко, чаще наше непонимание.
Пришла пора тебе познакомиться с копиями, глубокими и не очень

когда ты создаешь копию, питон постарается сделать как можно меньше работы, то есть список то он создаст, только вот внутрь поместит ссылки на содержимое первого списка, делать их копии (копии объектов из первого списка) он не будет.

И пока ты использовал неизменяемые типы данных (пример ниже с интами) то никаких проблем и не было. Но вот если в списке что-то изменяемое и ты бы не хотел, чтобы во втором списке была ссылка на тот же объект то нужно потрудиться.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> first = [1,2,3]
>>> second = first[:]
>>> first[0]=0
>>> first
[0, 2, 3]
>>> second
[1, 2, 3]
>>> first = [[1,2],[1,2]]  # mutable type !!!
>>> second = first[:]
>>> first[0].append(3)
>>> first
[[1, 2, 3], [1, 2]]
>>> second
[[1, 2, 3], [1, 2]]
>>> from copy import deepcopy
>>> first = [[1,2],[1,2]]
>>> second = deepcopy(first)
>>> first[0].append(3)
>>> first
[[1, 2, 3], [1, 2]]
>>> second
[[1, 2], [1, 2]]
1
17 / 17 / 0
Регистрация: 26.02.2013
Сообщений: 497
15.02.2021, 18:55  [ТС] 3
Точно, про copy я и забыл...
0
15.02.2021, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2021, 18:55
Помогаю со студенческими работами здесь

Странный глюк
Перестал работать один простой запрос, все вроде правильно сделал и раньше работало как положено....

Странный глюк?
Доброго времени суток! Опишу по порядку. У меня ОС: ХП СП3; Антивирус: Др.Вэб В бухгалтерии...

Странный глюк с браузером
Видеокарта GTX 560 и винт на 500 гиг перешли со старого компа на новый. Винт как хранилище данных,...

AnimateWindow странный глюк
Привет всем. Даже не знаю может у кого то будут хотя бы предположения, что это за фигня такая....

Странный глюк View?
Довольно странный глюк однако! Поначалу не мог понять в чем дело, толи ошибка скрипта.(script ok!)...

Странный глюк с вектором
Я определил операции: Присвоения: bool s; std::vector<int> v; void operator=(int get_i){ ...


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

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

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