QListView и QStandardItemModel проверяют текст перед редактированием строки

Я хочу проверить текст строки в QListView до того, как пользователь ее редактирует. Если это не соответствует шаблону, я не хочу это принимать.

В настоящее время у меня есть QListView и QStandardItemModel. Я могу легко добавлять и удалять элементы через QStandardItemModel. Я также установил модель представления списка.

Есть ли какие-то delegates или event функции в списке или модели для редактирования?


person Niklas    schedule 27.08.2013    source источник
comment
почему вы не можете сделать это в setData()?   -  person 4pie0    schedule 27.08.2013
comment
Вы перегрузили функции setData() и data() для своей модели?   -  person 4pie0    schedule 27.08.2013
comment
Нет, я их не перегружала.   -  person Niklas    schedule 27.08.2013


Ответы (2)


вы можете перегрузить функции data() и setData() из QStandardItemModel, тогда, когда пользователь попытается отредактировать элемент, ваш setData будет вызываться с помощью Qt::EditRole, и там вы сможете выполнить свою обработку.

http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#setData

person 4pie0    schedule 27.08.2013
comment
Знаете ли вы, можно ли переопределить appendRow? - person Niklas; 27.08.2013
comment
QStandardItemModel имеет функцию appendRow, она не является виртуальной, см. ссылку на класс qt- project.org/doc/qt-5.0/qtgui/qstandarditemmodel.html - person 4pie0; 27.08.2013
comment
вам не нужно переопределять его, поэтому он называется StandardItemModel, он просто каким-то образом определяет этот метод, и вы согласились на эту реализацию — вот почему вы выбрали StandardModel. Если вам нужно специальное поведение appendRow, вы должны наследовать от QAbstractItemModel, там appendRow является виртуальным, и вы можете его переопределить. - person 4pie0; 27.08.2013

Если я вас правильно понял, вы хотите проверить значение элемента в момент, когда пользователь пытается войти в режим редактирования?

Использование делегата должно работать для этого достаточно хорошо:

class MyItemDelegate : public QItemDelegate {
    public:
        QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
            if(index.data() == /* do whatever check you want here */) {
                return NULL; // Prevent editing
            }
            return QItemDelegate::createEditor(parent, option, index);
        }
};

listView->setItemDelegate(new MyItemDelegate());
person Chris    schedule 27.08.2013
comment
qDebug() << index.data().toString(); дает мне QVariant(QString, "asdfdsaf"), но не настоящую строку asdfdsaf. Как я могу получить необработанные данные. - person Niklas; 27.08.2013
comment
QString s = index.data().toString(); - person 4pie0; 27.08.2013