Найти - Пользователи
Полная версия: делегат QCheckBox для таблицы - что не так?
Начало » GUI » делегат QCheckBox для таблицы - что не так?
1
Lekks
Всем привет. Мучаюсь третий день. Вот код делегата:
 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) просто вышибает из приложения.
Что не так с делегатом или может в таблице?
Rodegast
Если мне память не изменяет, то при создании объекта делигаты нужно передавать в её класс ссылку на модель. Т.е. должно быть что то типа такого:
 tv.setItemDelegateForColumn (3, FlagDelegate(model))
Если не поможет, то приведи весь код.
Lekks
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 отрабатывают, а чекбокс ни в какую. Просто закрывается приложение.
Rodegast
> Теперь вот трудность, как чекбокс вывести для DisplayRoleб а то у меня там циферки остаются.

Ты мне класс модели покажи.
Lekks
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
Решено.
Pluto
На другом форуме добрый человек сумел разобраться и всё разъяснил:
Объекты делегатов нужно было сделать частью класса.
Т.е. вместо

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

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

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

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

Нашел на этом же форуме ))))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB