Estaba trasteando de nuevo (es lo malo de retomar proyectos después de un año, aunque por otro lado uno se acerca con otras perspectivas y hay cosas que ahora se ven muy claras) con QTableView, y me ha surgido una batería de dudas:
1.- Como quiero que haya algunos comportamientos especiales a la hora de manejar el tabulador y cursores, entiendo que tengo que manejar esas teclas con eventos del teclado, lo que me obliga a hacer uso de la función installEventFilter() para la tabla.
Hasta ahí bien, sin embargo ahora me encuentro que la tecla F2 ya no activa el modo de edición, y no sé cómo hacer para que vuelva a tener esa funcionalidad.
Por otro lado, me gustaría que la tecla Supr eliminara la fila entera si ésta está seleccionada, o solo el contenido de la celda actual. No veo en QTableView ni en QAbstractItemView ninguna función que indique si hay una fila seleccionada.
2.- Me gustaría que cuando cambiase el contenido de una celda se activase una función o señal que llamase a una función que se encargara de hacer alguna función asociada (realmente sería actualizar el dato en la fuente original, más allá del modelo)
Mi intento ha sido crear un delegado, y dentro de la función createEditor(), a la hora de crear el widget de edición, añadir una señal, algo así como:
Código C++:
Ver original
class DelegadoCiudades : public QStyledItemDelegate { public: DelegadoCiudades(QObject* parent); QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem&option, const QModelIndex&index) const; void setEditorData(QWidget * editor, const QModelIndex&index)const; void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex&index) const; public slots: void CambiarAlgo(int n); };
Y luego en la función createEditor():
Código C++:
Ver original
QWidget *DelegadoCiudades::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { const QAbstractItemModel * model = index.model(); if (!model) return QStyledItemDelegate::createEditor(parent,option, index); QComboBox * box = new QComboBox(parent); box->setEditable(true); box->setAutoCompletion(true); box->setModel(const_cast<QAbstractItemModel* >(model)); box->setModelColumn(index.column()); box->installEventFilter(const_cast<DelegadoCiudades * >(this)); connect(box,SIGNAL(currentIndexChanged(int)),this,SLOT(CambiarAlgo(int)));//<--Aquí el invento return box; }
Código C++:
Ver original
void DelegadoCiudades::CambiarAlgo(int n) { qDebug()<<"Cambiar Algo: "<<n; }
Pero no me funciona la señal, cuando el editor (un QComboBox) cambia el índice me sale el error de que la función CambiarAlgo() no es un slot.
3.- Esta la pregunté hace un año, pero no fui capaz de resolver el tema incluso con la ayuda que recibí del foro (gracias @eferion )
El caso es que una de las columnas es un QComboBox donde se pide/muestra el sexo de una persona, pero en lugar de poner texto sale un pequeño icono de un niño o una niña (es para los sobrinos, je je). Pero para que me mantenga el índice actual cuando paso por esa celda en modo de edición, he de enviar junto al icono, el índice asociado, y entonces se me ve el icono junto a un número (0 niños, 1 niñas). Y me gustaría que no se viera el número pero que no se perdiera el índice.
Bueno, me ha salido un post largo y me explico como un libro cerrado, así que me disculpo de antemano.
Saludos
(voy a ver si consigo poner el ejemplo completo en github), si lo hago, actualizo el hilo