I'm created a QStyledItemDelegate class in which I want to make some item checkable and some with two widgets. But it is not working right. What am I missing? This is what it looks like:
See row 1, looks like the two widgets are there but they are not really showing. And I need some help to make item checkable (this is different than adding a checkbox?). Thank you.
Here is my QStyledItemDelegate class :
//! [0]
SpinBoxDelegate::SpinBoxDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
//! [0]
//! [1]
QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.row()==1) {
QLineEdit* lineBox;
QCheckBox* checkBox;
QWidget *panel;
panel = new QWidget(parent);
QHBoxLayout *layout = new QHBoxLayout;
lineBox = new QLineEdit( );
lineBox->setText("abc");
checkBox = new QCheckBox( );
layout->addWidget(checkBox);
layout->addWidget(lineBox);
panel->setLayout(layout);
return panel;
}else if (index.row()==2) {
// need to make this check-able item?
}else{
QLineEdit *editor = new QLineEdit(parent);
return editor;
}
}
//! [1]
//! [2]
void SpinBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();
if (index.row()==1) {
// need something here?
}else{
QLineEdit *spinBox = static_cast<QLineEdit*>(editor);
spinBox->setText("value");
}
}
//! [2]
//! [3]
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
if (index.row()==1) {
// need something here?
}else{
QLineEdit *spinBox = static_cast<QLineEdit*>(editor);
model->setData(index, spinBox->text(), Qt::EditRole);
}
}
//! [3]
//! [4]
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
//! [4]
this is my main.cpp:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStandardItemModel model(4, 2);
//QTableView tableView;
QTreeView treeView;
treeView.setModel(&model);
SpinBoxDelegate delegate;
treeView.setItemDelegate(&delegate);
//! [0]
//tableView.horizontalHeader()->setStretchLastSection(true);
treeView.setRootIsDecorated(false);
treeView.setHeaderHidden(true);
treeView.setIndentation(20);
//! [1]
for (int row = 0; row < 4; ++row) {
for (int column = 0; column < 2; ++column) {
QModelIndex index = model.index(row, column, QModelIndex());
model.setData(index, QVariant((row + 1) * (column + 1)));
}
//! [1] //! [2]
}
//! [2]
//! [3]
treeView.setWindowTitle(QObject::tr("Spin Box Delegate"));
treeView.show();
return app.exec();
}
//! [3]
This is eventually what I want to achieve: