QItemDelegate с пользовательскими виджетами
-
26-12-2019 - |
Вопрос
у меня проблемы с моим QTableView
и QItemDelegate
занятия.Для одного столбца мой делегат создает простое поле со списком, и все работает нормально.Для второго столбца мне нужен виджет с двумя полями со списком в одном виджете.
Я написал следующий код в своем QItemDelegate
, чтобы внести ясность, здесь показан только код для моего второго столбца, который не работает.Другое простое поле со списком не отображается, поскольку оно работает нормально:
QWidget *UserDefinedUnitsDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem & option ,const QModelIndex & index ) const
{
//set up a simple widget with a layout
QWidget* pWidget = new QWidget(parent);
QHBoxLayout* hLayout = new QHBoxLayout(pWidget);
pWidget->setLayout(hLayout);
//add two combo boxes to the layout
QComboBox* comboEditor = new QComboBox(pWidget);
QComboBox* comboEditor2 = new QComboBox(pWidget);
//now add both editors to this
hLayout->addWidget(comboEditor);
hLayout->addWidget(comboEditor2);
return pWidget;
}
Теперь это отображается нормально, но когда я редактирую его и нажимаю в другом месте, редактирование не прекращается.Может ли кто-нибудь предложить какие-либо указатели?
Редактировать:Поэтому мне нужно в какой-то момент вызвать CommitData() и closeEditor().Может ли кто-нибудь подсказать, куда их звонить?
Спасибо.
Решение
Вы можете сохранить виджет редактора как член класса и генерировать commitData, когда текущий индекс одного из полей со списком изменился.Таким образом, вы можете подключить currentIndexChanged(int) к слоту и отправить оттуда commitData:
QWidget *UserDefinedUnitsDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem & option ,const QModelIndex & index ) const
{
//set up a simple widget with a layout
pWidget = new QWidget(parent);
QHBoxLayout* hLayout = new QHBoxLayout(pWidget);
pWidget->setLayout(hLayout);
//add two combo boxes to the layout
QComboBox* comboEditor = new QComboBox(pWidget);
QComboBox* comboEditor2 = new QComboBox(pWidget);
connect(comboEditor,SIGNAL(currentIndexChanged(int)),this,SLOT(setData(int)));
connect(comboEditor2,SIGNAL(currentIndexChanged(int)),this,SLOT(setData(int)));
//now add both editors to this
hLayout->addWidget(comboEditor);
hLayout->addWidget(comboEditor2);
return pWidget;
}
void UserDefinedUnitsDelegate::setData(int val)
{
emit commitData(pWidget);
}