Russian Qt Forum

Qt => Model-View (MV) => Тема начата: lexaaleynik от Декабрь 26, 2014, 17:05



Название: Какой сигнал эмитится при редактировании записи представления?
Отправлено: lexaaleynik от Декабрь 26, 2014, 17:05
Многие, увидев название темы, сразу подумают dataChanged(QModelIndex index, QModelIndex index), но не торопитесь. Имеется в виду не момент окончания редактирования записи, например при смене фокуса объекта, а в случае, если у меня записи представляются в виде ComboBox и юзер просто щелчком мыши  меняет текущий выбранный элемент списка этого ComboBox. Но пока не сменишь фокус, dataChanged не сгенерируется. Подумал о реализации через делегаты, посмотрел сигналы в QAbstractItemDelegate, но ничего нужного не нашёл.


Название: Re: Какой сигнал эмитится при редактировании записи представления?
Отправлено: PimenS от Декабрь 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


Название: Re: Какой сигнал эмитится при редактировани&#
Отправлено: Johnik от Декабрь 27, 2014, 17:17
Для классов унаследованных от QAbstractItemModel, есть специальная модель: QItemSelectionModel и соответственно методы:
Код
C++ (Qt)
QItemSelectionModel * QAbstractItemView::selectionModel() const;
void QAbstractItemView::setSelectionModel(QItemSelectionModel * selectionModel) [virtual];
 

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


Название: Re: Какой сигнал эмитится при редактировани&#
Отправлено: lexaaleynik от Декабрь 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];
 
?


Название: Re: Какой сигнал эмитится при редактировани&#
Отправлено: Johnik от Декабрь 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 и соответственно методы