2013-08-26 2 views
3

Работа с QTableView и QAbstractTableModel - когда модель излучает событие dataChanged для редактируемой ячейки, строка, введенная пользователем в ячейке (но не нажатая, введите «commit» редактировать).QTableView: редактируемая ячейка ячейки данных с измененной ячейкой данных

Пример: Выберите ячейку, тип «123», ячейка все еще находится в режиме редактирования ожидания больше текста, dataChanged испускается и «123» удаляется, оставляя пустую ячейку в режим редактирования.

Кто-нибудь знает, как остановить это поведение, или как модель может обнаружить, когда ячейка редактируется, чтобы предотвратить появление событий dataChanged для этой ячейки?

+0

Я не уверен, но, возможно, это неправильно EditTriggers установленные на ваш взгляд? QAbstractItemView :: CurrentChanged выглядит так, как будто это может вызвать подобное поведение. – Greenflow

+0

Можно ли использовать blockignals из модели при редактировании? и разблокировать сигнал после редактирования? ». – Ashif

ответ

2

Я была такая же проблема. Дело в том, что функция data() вызывается с другим параметром role. Для отображения role==Qt::DisplayRole и при редактировании вызывается с role==Qt::EditRole. Например попробуйте изменить

QVariant MyModel::data(const QModelIndex & index, int role) const 
{ 
    if (role == Qt::DisplayRole) 
    return QString("Text to Edit"); 
} 

в

QVariant MyModel::data(const QModelIndex & index, int role) const 
{ 
    if (role == Qt::DisplayRole || role == Qt::EditRole) 
    return QString("Text to Edit"); 
} 

, который должен сделать трюк

0

Проверьте класс модели, вы должны переопределить метод setData в своей модели. Если каждая вещь правильно будет обновлять модели после редактирования данных ... пожалуйста, дайте мне знать, если у вас есть другой вариант осуществления

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    if (index.isValid() && role == Qt::EditRole) { 
     int row = index.row(); 
     int col = index.column(); 

      //// change data 

     emit(dataChanged(index, index)); 
     return true; 
    } 

    return false; 
} 
+0

Я сделал это - это не проблема. Проблема в том, что, хотя пользователь редактирует пользовательский интерфейс и до того, как 'setData' называется UI, обновляется из-за события' dataChanged' и вытирает частично входные данные. – Zero

+0

Вы используете QAbstractItemDelegate? – Mostafa

+0

Нет, я не использую 'AbstractItemDelegate' – Zero

Смежные вопросы