Ver Mensaje Individual
  #10 (permalink)  
Antiguo 01/12/2016, 11:10
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Qt. Cómo evitar el modo de edición al avanzar con Tab

Hola eferion, sabía como funcionaban los delegados....porque ya me lo habías explicado , lo que pasa es que cuando no me salen las cosas uno acaba sin saber dónde tiene la cara.

Bueno, lo he "solucionado" pero no estoy nada convencido de que esta sea una solución decente.
Al menos he podido delegar los eventos en los delegados (nunca mejor dicho) pero necesito conectar la señal closeEditor() a la tabla.

En realidad lo que he hecho es capturar la tecla Tab en el editor del delegado, cuyas consecuencias son actualizar el dato de la celda y cerrar el editor
Código C++:
Ver original
  1. commitData(mieditor);
  2. closeEditor(mieditor);

Por otro lado, he conectado la señal closeEditor a un slot que se encarga de mover el índice actual de la tabla. No parece un diseño muy aceptable

En fin, este sería el código de lo que he hecho finalmente (la implementación está incompleta pero todo parece pensar que va a funcionar)

en el delegado:

Código C++:
Ver original
  1. bool MiDelegado::eventFilter(QObject * editor, QEvent * event)
  2. {
  3.     if (!editor)
  4.     {
  5.         return false;
  6.     }
  7.     if (event->type() == QEvent::KeyPress)
  8.     {
  9.         QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
  10.         if (keyEvent->key() == Qt::Key_Tab)
  11.         {
  12.             QLineEdit* mieditor = dynamic_cast<QLineEdit*>(editor);
  13.             commitData(mieditor);
  14.             closeEditor(mieditor);
  15.             return true;
  16.         }
  17.     }
  18.     return false;
  19. }

La conexión SIGNAL/SLOT

Código C++:
Ver original
  1. QObject::connect(delegado,SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)),this,SLOT(Posicionar()));

Y el código del SLOT (incompleto)
Código C++:
Ver original
  1. void Widget::Posicionar()
  2. {
  3.     QModelIndex current = ui->tableView->currentIndex();
  4.     qDebug()<<current.row()<<"<-->"<<current.column();
  5.     if (current.column()<ui->tableView->model()->columnCount(QModelIndex()))
  6.     {
  7.         QModelIndex newIndex = ui->tableView->model()->index(current.row(),current.column()+1);
  8.         ui->tableView->setCurrentIndex(newIndex);
  9.     }
  10. }
__________________
Mi calculadora en Qt