Форум сайта python.su
Всем привет. Мучаюсь третий день. Вот код делегата:
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.setItemDelegateForColumn (3, FlagDelegate(model))
Офлайн
Rodegast, заменил строку:
CHval = int(index.model().data(index, QtCore.Qt.EditRole))на
CHval = index.model().data(index, QtCore.Qt.EditRole)(ошибка преобразования была).
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)
Отредактировано Lekks (Ноя. 30, 2019 20:39:11)
Прикреплённый файлы:
Таблица.png (19,7 KБ)
Офлайн
> Теперь вот трудность, как чекбокс вывести для DisplayRoleб а то у меня там циферки остаются.
Ты мне класс модели покажи.
Офлайн
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()
Отредактировано Lekks (Ноя. 30, 2019 22:08:04)
Офлайн
Решено.
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)
Офлайн