Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Пытон от Март 02, 2017, 07:26



Название: QStandardItemModel. EditRole, DisplayRole - как хранить разные данные в них?
Отправлено: Пытон от Март 02, 2017, 07:26
Код
Python
model = QtGui.QStandardItemModel()
item = QtGui.QStandardItem()
item.setData("view", QtCore.Qt.DisplayRole)
item.setData("edit", QtCore.Qt.EditRole)
 
model.appendRow([item])
 
print (model.data(model.index(0,0), QtCore.Qt.EditRole))
print (model.data(model.index(0,0), QtCore.Qt.DisplayRole))
 
Получим в итоге:
edit
edit

Т.е. и EditRole и DisplayRole хранят значение из последнего item.setData

Я чего-то не понимаю? Почему item.setData("edit", QtCore.Qt.EditRole) заодно меняет и DisplayRole?
А на кой ляд тогда нужны вообще эти EditRole и DisplayRole?
Я наивно полагал, что для того, чтобы иметь возможность отображать в ячейке таблицы одно значение, а хранить для обработки другое.


Название: Re: QStandardItemModel. EditRole, DisplayRole - как хранить разные данные в них?
Отправлено: __Heaven__ от Март 02, 2017, 07:36
Если я не путаю :

Цитировать
Код
C++ (Qt)
[virtual] void QStandardItem::setData(const QVariant &value, int role = Qt::UserRole + 1)
.........
Note: The default implementation treats Qt::EditRole and Qt::DisplayRole as referring to the same data.


Название: Re: QStandardItemModel. EditRole, DisplayRole - как хранить разные данные в них?
Отправлено: Пытон от Март 02, 2017, 08:12
Премного благодарен. Данные в UserRole сохраняются и отличаются от DisplayRole
-----
Но кто-то тогда может мне объяснить для чего используется EditRole?


Название: Re: QStandardItemModel. EditRole, DisplayRole - как хранить разные данные в них?
Отправлено: __Heaven__ от Март 02, 2017, 09:12
Он используется для того, чтобы создавать пользовательские модели, наследованные от QAbstract***Model.
Например табельный номер. Я могу выводить DisplayRole как QVariant(QStringLiteral("№%1").arg(number)), а редактировать EditRole как QVariant(number) чтобы стандартный делегат предоставлял мне виджет для редактирования чисел, а не строк и в setData принимал QVariant конвертируемый в uint.


Название: Re: QStandardItemModel. EditRole, DisplayRole - как хранить разные данные в них?
Отправлено: Swa от Март 02, 2017, 09:14
Qt::DisplayRole   0   The key data to be rendered in the form of text. (QString)
Qt::EditRole   2   The data in a form suitable for editing in an editor. (QString)

Допустим, вы выводите в таблице зарплату сотрудника.
Qt::DisplayRole (QString) : "1000 р."
Qt::EditRole (int для редактирования) : 1000

В зависимости от типа данных в Qt::EditRole будет создаваться соответствующий делегат для редактирования этих данных.