Qitemdelegate con widget personalizzati
-
26-12-2019 - |
Domanda
Sto avendo problemi con le mie classi QTableView
e QItemDelegate
.Per una colonna il mio delegato crea una semplice casella combinata e tutto funziona bene.Per la mia 2a colonna ho bisogno di un widget che ha due caselle combinate in un singolo widget.
Ho scritto il seguente codice nel mio QItemDelegate
, solo per essere chiaro Questo mostra solo il codice per la mia 2a colonna, quella che non funziona.L'altra semplice combinazione di combo non è mostrata in quanto funziona bene:
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;
}
.
Ora questo viene visualizzato solo bene ma quando lo modifico e fai clic su altrove non smette di smettere di modificare.Qualcuno può offrire qualche suggerimento?
Modifica: quindi ho bisogno di chiamare commitdata () e ravvicinarsi () ad un certo punto.Qualcuno può offrire puntatori su dove chiamarli?
Grazie.
Soluzione
È possibile mantenere il widget dell'editor come membro della classe ed emettere commitData quando l'indice corrente di uno dei ComboBox è cambiato.Quindi è possibile connetterti currenindexchanged (int) a uno slot ed emettere commitData da 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);
}
.