Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » делегат QCheckBox для таблицы - что не так? [RSS Feed]

#1 Ноя. 30, 2019 18:17:00

Lekks
Зарегистрирован: 2019-11-30
Сообщения: 12
Репутация: +  2  -
Профиль   Отправить e-mail  

делегат QCheckBox для таблицы - что не так?

Всем привет. Мучаюсь третий день. Вот код делегата:

 class FlagDelegate (QtWidgets.QStyledItemDelegate):
    
    def createEditor (self, parent, options, index):
        editor = QtWidgets.QCheckBox(parent)
        return editor
    def setEditorData (self, editor, index):
        CHval = int(index.model().data(index, QtCore.Qt.EditRole))
        if CHval == 0:
            editor.setCheckState (QtCore.Qt.Unchecked)
        else: editor.setCheckState (QtCore.Qt.Checked)
    def updateEditorGeometry (self, editor, options, index):
        editor.setGeometry (options.rect)
    def setModelData (self, editor, model, index):
        UNval = editor.checkState ()
        if UNval == QtCore.Qt.Unchecked:
            modelVal = 0
        else: modelVal = 1
        model.setData (index, modelVal, QtCore.Qt.EditRole);

при выполнении строки кода
 tv.setItemDelegateForColumn (3, FlagDelegate())
(tv - QTableView с моделью QStandardItemModel) просто вышибает из приложения.
Что не так с делегатом или может в таблице?

Офлайн

#2 Ноя. 30, 2019 19:45:09

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

делегат QCheckBox для таблицы - что не так?

Если мне память не изменяет, то при создании объекта делигаты нужно передавать в её класс ссылку на модель. Т.е. должно быть что то типа такого:

 tv.setItemDelegateForColumn (3, FlagDelegate(model))
Если не поможет, то приведи весь код.



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

Офлайн

#3 Ноя. 30, 2019 20:07:26

Lekks
Зарегистрирован: 2019-11-30
Сообщения: 12
Репутация: +  2  -
Профиль   Отправить e-mail  

делегат QCheckBox для таблицы - что не так?

Rodegast, заменил строку:

CHval = int(index.model().data(index, QtCore.Qt.EditRole))
на
CHval = index.model().data(index, QtCore.Qt.EditRole)
(ошибка преобразования была).
Теперь вот трудность, как чекбокс вывести для DisplayRoleб а то у меня там циферки остаются.

P.S. С моделью QtGui.QStandardItemModel работает для EditRole, а с моделью QtSql.QSqlRelationalTableModel не работает.

     def set_model (self, tnsm):
        self.tab2.setModel(self.Tab_model)
        if tnsm == "pricon":
            self.tab2.setItemDelegateForColumn (1, QtSql.QSqlRelationalDelegate(self.tab2))
        if tnsm == "people":
            deleg1 = DateDelegate()
            deleg2 = FlagDelegate()
            self.tab2.setItemDelegateForColumn (5, QtSql.QSqlRelationalDelegate(self.tab2))
            self.tab2.setItemDelegateForColumn (4, deleg1)
            self.tab2.setItemDelegateForColumn (6, deleg2)
        self.tab2.resizeColumnsToContents()
        self.tab2.verticalHeader().hide()
        self.tab2.setColumnWidth (0,0)
делегаты в столбцах 4 и 5 отрабатывают, а чекбокс ни в какую. Просто закрывается приложение.

Отредактировано Lekks (Ноя. 30, 2019 20:39:11)

Прикреплённый файлы:
attachment Таблица.png (19,7 KБ)

Офлайн

#4 Ноя. 30, 2019 21:45:35

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

делегат QCheckBox для таблицы - что не так?

> Теперь вот трудность, как чекбокс вывести для DisplayRoleб а то у меня там циферки остаются.

Ты мне класс модели покажи.



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

Офлайн

#5 Ноя. 30, 2019 22:00:00

Lekks
Зарегистрирован: 2019-11-30
Сообщения: 12
Репутация: +  2  -
Профиль   Отправить e-mail  

делегат QCheckBox для таблицы - что не так?

Rodegast
Класс модели - практически клон QtSql.QSqlRelationalTableModel с переопределенными в зависимости от выбранной таблицы заголовками полей и установленными связями таблиц (setRelation). В общем только переопределенный модуль __init__ с кучей строк типа if tablename = “”: self.setHeaderData (…).

Вот в таком коде:

        
 if tnsm == "people":
            try:
                deleg1 = DateDelegate()
                deleg2 = FlagDelegate()
                self.tab2.setItemDelegateForColumn (5, QtSql.QSqlRelationalDelegate(self.tab2))
                self.tab2.setItemDelegateForColumn (4, deleg1)
                self.tab2.setItemDelegateForColumn (6, deleg2)
            except Exception:
                Err = sys.exc_info()
                f = open (r"F:\ПРОГРАММЫ\Девелоп\Проекты Python\TESTS\Пароли.TXT", "a", encoding="cp1251")
                f.write (Err)
                f.close()
                print (Err)
                input()
            finally:
                print (self.Tab_model.index(0,6).data(QtCore.Qt.DisplayRole))
                print ("ЖЕСТЬ")
                input()

данные по индексу - 0 (есть только одна строка в таблице БД со значением 0 в последнем столбце);
в консоль выводит “ЖЕСТЬ”, сведений об исключении нет ни в консоли, ни в файле.

Отредактировано Lekks (Ноя. 30, 2019 22:08:04)

Офлайн

#6 Дек. 1, 2019 07:56:18

Lekks
Зарегистрирован: 2019-11-30
Сообщения: 12
Репутация: +  2  -
Профиль   Отправить e-mail  

делегат QCheckBox для таблицы - что не так?

Решено.

Pluto
На другом форуме добрый человек сумел разобраться и всё разъяснил:
Объекты делегатов нужно было сделать частью класса.
Т.е. вместо

spinbox_delegate1 = spinbox_delegate()
self.view1.setItemDelegateForColumn(4, spinbox_delegate1)

Нужно было сделать

self.spinbox_delegate1 = spinbox_delegate()
self.view1.setItemDelegateForColumn(4, self.spinbox_delegate1)

Для обоих делегатов, естественно.

Нашел на этом же форуме ))))

Отредактировано Lekks (Дек. 1, 2019 07:56:55)

Офлайн

  • Начало
  • » GUI
  • » делегат QCheckBox для таблицы - что не так?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version