Question

I need to implement a table in Qt that shows a Combo Box on each row on a particular column.

So far based on this example: http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.html and on this question: QStandardItem + QComboBox I succesfully managed to create a QItemDelegate.

My problem is that everything works fine if I implement it from my main() function in main.cpp, but it does not work well if I insert the table in Qt Designer to use it then within a function of MainWindow class in mainwindow.cpp.

Could you please give me a clue? Thanks in advance!

Delegation on main.cpp (it works well, when I double click on the second column it shows a Combo Box):

QStandardItemModel model(4, 2);
QTableView tableView;
tableView.setModel(&model);
ComboBoxDelegate delegate;
tableView.setItemDelegateForColumn(1,&delegate);
tableView.horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model.index(row, col, QModelIndex());
        model.setData(index, QVariant((row+1) * (col+1)));
    }
}
tableView.show();

Delegation on mainwindow.cpp alternative 1 (it shows an empty table)

QStandardItemModel model(4,2);
ui->tablePoint->setModel(&model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model.index(row, col, QModelIndex());
        model.setData(index, QVariant((row+1) * (col+1)));
    }
}

Delegation on mainwindow.cpp alternative 2 (it shows the table but when I double click on the second column it does not show the Combo Box. Instead it shows the regular Spin Box):

QStandardItemModel* model = new QStandardItemModel(4,2);
ui->tablePoint->setModel(model);
ComboBoxDelegate delegate;
ui->tablePoint->setItemDelegateForColumn(1,&delegate);
ui->tablePoint->horizontalHeader()->setStretchLastSection(true);

for (int row = 0 ; row < 4; ++row) {
    for (int col = 0; col < 2; ++col) {
        QModelIndex index = model->index(row, col, QModelIndex());
        model->setData(index, QVariant((row+1) * (col+1)));
    }
}
Was it helpful?

Solution

Assuming that in both mainwindow.cpp cases, the code you show is in the constructor, you do the classic "coming from java, python, perl or any language where you don't give a damn about memory management" error to allocate your model and/or delegate on the stack rather than on the heap.

In c++, stuff allocated on the stack (e.g. QStandardItemModel model(4,2);) is destroyed when returning from the function, while stuff allocated on the heap (e.g. QStandardItemModel* model = new QStandardItemModel(4,2); lives until you delete it). Case 1 works because stuff allocated on the stack in main() lives for the duration of the app.

Bottom line: for case 3, do a ComboBoxDelegate* delegate = new ComboBoxDelegate(); and ui->tablePoint->setItemDelegateForColumn(1,delegate);

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top