2014-09-16 5 views
0

У меня возникла проблема с компонентом QListView.QlistView setCurrentIndex() не работает

Я создал простую форму со списком и таблицей. Тогда я положил этот код, как виджеты заселить с моделью данных, как я хочу:

QSqlQueryModel * modela = new QSqlQueryModel(); 
QSqlQueryModel * modelb = new QSqlQueryModel(); 

[...] 

ui->listView->setModel(modela); 
ui->tableView->setModel(modelb); 

[...] 

void MyWindow::on_listView_clicked(const QModelIndex &index) 
{ 
ui->tableView->setCurrentIndex(ui->listView->currentIndex()); 
} 

void MyWindow::on_tableView_clicked(const QModelIndex &index) 
{ 
ui->listView->setCurrentIndex(ui->tableView->currentIndex()); 
// FAILS, does not react... 
} 

Первый слот (при нажатии любой элемент в списке следует виджет) работает, как и ожидалось, он автоматически выбирает соответствующий пункт в виджет tableview, но второй случай не работает, он просто не выбирает какой-либо элемент в списке ...

Что я хочу, так это то, что любой элемент, который пользователь нажимает в представлении таблицы, выбирается в списке.

Возможно ли это? Я очень старался, ища примеры и официальную документацию qt, но я не нашел правильного пути (также пытался подключиться к сигналу/слотам, но я не знаю, как точно подключить оба виджета).

Заранее спасибо.

+1

Как знать, что выбрать? Вы используете индексы табличного представления для выбора элементов в представлении списка? Hm ... – vahancho

+0

Индекс одинаковый для обоих виджетов, поэтому, если пользователь нажимает на третью строку в представлении таблицы, тогда третья строка списка должна быть выбрана (или выделена). Я сейчас пытаюсь это решение: аннулируются MyWindow :: on_tableView_clicked (Const QModelIndex и индекс) { ui-> listView-> setCurrentIndex (ui-> tableView-> currentIndex()); ui-> listView-> selectionModel() -> select (ui-> listView-> model() -> index (ui-> tableView-> currentIndex(). Row(), 0), QItemSelectionModel :: SelectCurrent); И это работает, но кажется очень уродливым способом ... } –

+0

Почему бы не использовать два вида таблиц или два вида списка? – vahancho

ответ

2

QModelIndex является неотъемлемой частью определенного QAbstractItemModel. Это означает, что вы не можете использовать индекс из модели A для выбора элемента в виде модели B.

QModelIndex не просто пара x, y. Он также сохраняет указатель на модель, которая ее создала.

Так что если вам нужно выбрать ту же строку, что и в первом представлении, вам нужно извлечь строку из первого индекса, а затем получить нужный индекс во второй модели и использовать ее для выбора элемента во втором взгляд:

void selectTheSameRow(const QModelIndex& indexFromModelA) 
{ 
    int row = indexFromModelA.row(); 
    QModelIndex indexFromModelB = modelB->index(row, 0); 
    viewB->setCurrentIndex(indexFromModelB); 
} 
+0

Вызов 'setCurrentIndex()' не означает выбор элемента. – vahancho

+0

Это зависит от 'selectionMode', но в большинстве случаев это происходит. Посмотрите на 'QItemSelectionModel :: setCurrentIndex' (модель называет этот метод) он пересылает' select'. – Ezee

+0

@ Ответ вы очень хорошо объясняете мое недоразумение о QModelIndex, интересно, почему есть еще некоторые виджеты (например, combobox), где QModelIndex представляется просто целым числом, но это еще одна тема ... Спасибо за ваш ответ! –