Qt:Cree un QItemDelegate para tener un editor personalizado (Combo Boxes) en un QTableView con QStandardItemModel

StackOverflow https://stackoverflow.com//questions/9672158

Pregunta

Necesito implementar una tabla en Qt que muestre un cuadro combinado en cada fila de una columna en particular.

Hasta ahora basado en este ejemplo:http://doc.qt.nokia.com/4.7-snapshot/itemviews-spinboxdelegate.htmly sobre esta pregunta:QStandardItem + QComboBoxLogré crear con éxito un QItemDelegate.

Mi problema es que todo funciona bien si lo implemento desde mi función main() en main.cpp, pero no funciona bien si inserto la tabla en Qt Designer para usarla luego dentro de una función de la clase MainWindow en mainwindow.cpp .

¿Podrías darme una pista?¡Gracias de antemano!

Delegación en main.cpp (funciona bien, cuando hago doble clic en la segunda columna muestra un cuadro combinado):

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();

Delegación en mainwindow.cpp alternativa 1 (muestra una tabla vacía)

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)));
    }
}

Delegación en mainwindow.cpp alternativa 2 (muestra la tabla pero cuando hago doble clic en la segunda columna no muestra el cuadro combinado.En su lugar, muestra el cuadro de giro normal):

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)));
    }
}
¿Fue útil?

Solución

Suponiendo que en ambos casos de mainwindow.cpp, el código que muestras está en el constructor, haces el clásico error "proveniente de java, python, perl o cualquier lenguaje donde no te importe un carajo la administración de memoria" para asignar tu modelo y/o delegar en la pila en lugar de en el montón.

En C++, las cosas asignadas en la pila (p. ej. QStandardItemModel model(4,2);) se destruye al regresar de la función, mientras que las cosas asignadas en el montón (p. ej. QStandardItemModel* model = new QStandardItemModel(4,2); vive hasta que tu delete él).El caso 1 funciona porque las cosas asignadas en la pila en main() vive durante la duración de la aplicación.

Línea de fondo:para el caso 3, haz un ComboBoxDelegate* delegate = new ComboBoxDelegate(); y ui->tablePoint->setItemDelegateForColumn(1,delegate);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top