ich benutze Qt 4.7.0 und lasse mit QTableView ein QSqlRelationalTableModel anzeigen, wenn der Nutzer durch die Tabelle tabt, wird die nächste Zelle aktive, sie wird selektiert und die vorherige deselektiert. Das ist OK so.
Nun möchte ich, dass wenn der Nutzer in Spalte 7 die Tab-Taste drückt, zur 1. Spalte der nächsten Zeile gewechselt wird. Die Zellen jenseits der 7. Spalte sollen jedoch weiterhin bspw. durch die Maus aktiviert und auch selektiert werden können.
Folgende 2 Ansätze habe ich versucht, jedoch haben beide dasselbe Problem: Der Index geht auf die nächste Zeile, die ausgewählte Zelle jedoch bleibt in der alten Zeile. Beispiel: aktuell gewählte Zelle ist 4x7, die auch die einzige selektierte ist, Nutzer drückt Tab-taste, 5x1 wird die aktive Zelle, 4x8 jedoch die ausgewählte Zelle.
Wenn "logger("clear", true);" ausgeführt wird, ist keine Zelle selektiert, was IMHO besagt, dass ui->table->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); funktioert; sobald der Signalhandler jedoch beendet wird, wird die Zelle in Spalte 8 wieder aktiviert.
Was kann ich tun, damit die Auswahl in der alten Zeile aufgehoben wird, oder besser nur die aktuelle Zelle ausgewählt ist?
Code: Alles auswählen
#if 1 // just use one connect() at a time
connect(ui->table->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&,const QItemSelection&)), this, SLOT(selChanged(const QItemSelection&,const QItemSelection&)));
#else
connect(ui->table->selectionModel(), SIGNAL(currentChanged(const QModelIndex&,const QModelIndex&)), this, SLOT(curChanged(const QModelIndex&,const QModelIndex&)));
#endif
Code: Alles auswählen
void db::curChanged(const QModelIndex &n, const QModelIndex &o)
{
logger(QString("curChanged(): old=%1x%2 new=%3x%4").arg(o.row()).arg(o.column()).arg(n.row()).arg(n.column()));
if(o.row() == n.row() && n.column() == 8 && o.column() == 7) {
int r = 1 + n.row();
int c = firstVisibleColumn();
logger(QString("curChanged() set selection %1x%2").arg(r).arg(c));
QModelIndex index = ui->table->model()->index(r, c);
ui->table->selectionModel()->clear();
ui->table->setCurrentIndex(index);
ui->table->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect);
//logger("clear", true);
}
}
Code: Alles auswählen
void db::selChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
if(!selected.isEmpty() && selected.size() == 1
&& !deselected.isEmpty() && deselected.size() == 1
) {
QModelIndex o = deselected.indexes().first();
QModelIndex n = selected.indexes().first();
//logger(QString("selChanged(): old=%1x%2 new=%3x%4").arg(o.row()).arg(o.column()).arg(n.row()).arg(n.column()));
if(o.row() == n.row() && n.column() == 8 && o.column() == 7) {
int r = 1 + n.row();
int c = firstVisibleColumn();
QModelIndex index = ui->table->model()->index(r, c);
//ui->table->selectionModel()->clear();
ui->table->setCurrentIndex(index);
ui->table->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect);
//logger("clear", true);
}
}
}