Уведомления

Группа в Telegram: @pythonsu

#1 Май 18, 2017 18:53:40

axinax
Зарегистрирован: 2017-01-06
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

QSqlTableModel и Sqlalchemy

Для заполнения форм из базы данных я использовал sqlalchemy ORM и переопределенную QAbstractTableModel отсюда Combobox у меня заполняется данными из базы данных, но в консоли постоянно пишет ошибку TypeError: PyQt4.QtCore.QVariant represents a mapped type and cannot be instantiated, которая возникает в этом методе класса модели:

     def data(self, index, role=Qt.DisplayRole):
        if not index.isValid():
            return QVariant()
        elif role not in (Qt.DisplayRole, Qt.EditRole):
            return QVariant()
        row = self.results[index.row()]
        name = self.fields[index.column()][2]
        return getattr(row, name) 
в строке elif.
Что это и как с этим бороться?

Офлайн

#2 Май 18, 2017 19:30:19

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

QSqlTableModel и Sqlalchemy

> Что это и как с этим бороться?

Не возвращать QVariant. Это же очевидно.



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

Офлайн

#3 Май 19, 2017 00:47:59

axinax
Зарегистрирован: 2017-01-06
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

QSqlTableModel и Sqlalchemy

Не возвращать QVariant.
А как? Я не могу найти, где устанвливаются Qt.DisplayRole. Запрос по документации Qt выдает в основном ссылки на этот самый метод data где один из параметров - role.
Я до конца не могу понять механизм этих ролей. Где, кем и как определяется будет ли дисплей роль или эдит роль или другая?
Методом тыка пытался добавить в список исключений UserRole - не помогло

Офлайн

#4 Май 19, 2017 10:54:08

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

QSqlTableModel и Sqlalchemy

Там всё очень просто. Qt запрашивает данные у модели через метод data, а для чего он их использует передаётся через параметр role и в зависимости от этого параметра нужно отдавать разные данные:

 def data(self, idx, role=QtCore.Qt.DisplayRole):
	if idx.isValid():
		if role == QtCore.Qt.DisplayRole:
			return u"Текст для отображения на экране"
		elif role == QtCore.Qt.FontRole:
                         return QtGui.QFont( ... )
		elif role == QtCore.Qt.ToolTipRole:
                         return u"Текст для подсказки"

Список ролей смотри в документации http://doc.qt.io/qt-4.8/qt.html#ItemDataRole-enum



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

Отредактировано Rodegast (Май 19, 2017 10:54:54)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version