Russian Qt Forum
Май 14, 2024, 02:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Какой сигнал эмитится при редактировании записи представления?  (Прочитано 3631 раз)
lexaaleynik
Гость
« : Декабрь 26, 2014, 17:05 »

Многие, увидев название темы, сразу подумают dataChanged(QModelIndex index, QModelIndex index), но не торопитесь. Имеется в виду не момент окончания редактирования записи, например при смене фокуса объекта, а в случае, если у меня записи представляются в виде ComboBox и юзер просто щелчком мыши  меняет текущий выбранный элемент списка этого ComboBox. Но пока не сменишь фокус, dataChanged не сгенерируется. Подумал о реализации через делегаты, посмотрел сигналы в QAbstractItemDelegate, но ничего нужного не нашёл.
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Декабрь 26, 2014, 18:31 »

Может подойдет такой способ:

Использую для комбобокс делегата QItemDelegate, переопределяю createEditor

Код:
QWidget *sAlignDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& /* option */, const QModelIndex& /* index */) const
{
    QComboBox *editor = new QComboBox(parent);
    editor->addItem(tr("Left"), 1);
    editor->addItem(tr("Right"), 2);
    editor->addItem(tr("Center"), 4);
    editor->installEventFilter(const_cast<sAlignDelegate *>(this));
    return editor;
}

переопределяю setEditorData, куда передаю текущее значение из модели:

Код:
void sAlignDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    int value = index.model()->data(index, Qt::EditRole).toInt();
    QComboBox *combo = static_cast<QComboBox*>(editor);
    combo->setCurrentIndex(combo->findData(value));
    connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)));
}

когда меняю значение в комбобоксе, отправляю сигнал о смене значение.

Код:
void sAlignDelegate::indexChanged(int idx)
{
    emit currentDataChanged(idx);
}

А когда теряется фокус, отрабатывает переопределенный setModelData

Код:
void sAlignDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const
{
    QComboBox *combo = static_cast<QComboBox*>(editor);
    int value = combo->itemData(combo->currentIndex()).toInt();
    model->setData(index, value);
}

и соответственно только тогда отрабатывает dataChanged
Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #2 : Декабрь 27, 2014, 17:17 »

Для классов унаследованных от QAbstractItemModel, есть специальная модель: QItemSelectionModel и соответственно методы:
Код
C++ (Qt)
QItemSelectionModel * QAbstractItemView::selectionModel() const;
void QAbstractItemView::setSelectionModel(QItemSelectionModel * selectionModel) [virtual];
 

А у QComboBox есть соответствующие сигналы.
Записан
lexaaleynik
Гость
« Ответ #3 : Декабрь 29, 2014, 14:09 »

Для классов унаследованных от QAbstractItemModel, есть специальная модель: QItemSelectionModel и соответственно методы:
Код
C++ (Qt)
QItemSelectionModel * QAbstractItemView::selectionModel() const;
void QAbstractItemView::setSelectionModel(QItemSelectionModel * selectionModel) [virtual];
 

А у QComboBox есть соответствующие сигналы.

Способ комментатора PimenS я понял, а вот Ваш способ не понял

Соответствующие сигналы у ComboBox, это вы имеете ввиду currentIndexChanged(int) и currentIndexChanged(String)?
Если да, то причём тут модель QItemSelectionModel? И как мне помогут методы
Код
C++ (Qt)
QItemSelectionModel * QAbstractItemView::selectionModel() const;
void QAbstractItemView::setSelectionModel(QItemSelectionModel * selectionModel) [virtual];
 
?
Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #4 : Декабрь 29, 2014, 14:16 »

Соответствующие сигналы у ComboBox, это вы имеете ввиду currentIndexChanged(int) и currentIndexChanged(String)?
да

Если да, то причём тут модель QItemSelectionModel? И как мне помогут методы
Код
C++ (Qt)
QItemSelectionModel * QAbstractItemView::selectionModel() const;
void QAbstractItemView::setSelectionModel(QItemSelectionModel * selectionModel) [virtual];
 
?
я опечатался: QItemSelectionModel -> QItemSelectionView

В итоге следует читать как:
Цитировать
Для классов унаследованных от QAbstractItemView, есть специальная модель: QItemSelectionModel и соответственно методы
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 23.