QItemDelegate com widgets personalizados
-
26-12-2019 - |
Pergunta
Estou tendo problemas com meu QTableView
e QItemDelegate
classes.Para uma coluna minha delegado cria uma caixa de combinação simples e tudo funciona muito bem.Para a minha 2ª coluna, eu preciso de um widget que tem duas caixas de combinação em um único widget.
Eu escrevi o seguinte código no meu QItemDelegate
, só para ficar claro, isso só mostra o código para a minha 2ª coluna, o que não funciona.O simples caixa de Combinação não é mostrado como ele funciona muito bem:
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;
}
Agora, este apresenta apenas bom, mas quando eu editar e clique em outro lugar ele não parar a edição.Alguém pode oferecer algumas sugestões?
Editar:Então, eu preciso chamar CommitData() e closeEditor() em algum ponto.Alguém pode oferecer indicações sobre onde para chamar esses?
Obrigado.
Solução
Você pode manter o editor do widget como um membro da classe e emitem commitData quando o índice atual de um dos comboboxes foi alterado.Assim você pode conectar currentIndexChanged(int) para um slot e emitem commitData de lá:
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);
}