Сигнал, когда выбор QListView изменяется из-за активности клавиатуры?

У меня есть QDialog, созданный с помощью Qt Designer, который выглядит так:Dialog

список серверов слева-это QListView с QStringListModel. Щелчок мышью по элементу в представлении списка обновляет форму с информацией для выбранного элемента, подключая сигнал активированного представления (QModelIndex) к функции слота в диалоговом окне.

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

2 ответов


на activated(QModelIndex) сигнал на самом деле относится к чему-то большему, чем просто акт выбора. Концепция довольно расплывчата, но это больше похоже на акт явного выбора. Если вы просто ищете уведомление об изменении текущего выбора, вы можете захватить модель выбора и подключиться к ее обновлениям.

MyView::MyView() {
   QListView* view = new QListView(this);
   connect(view->selectionModel(), 
      SIGNAL(selectionChanged(QItemSelection,QItemSelection)), 
      this, SLOT(handleSelectionChanged(QItemSelection)));
}

...

MyView::handleSelectionChanged(const QItemSelection& selection){
   if(selection.indexes().isEmpty()) {
      clearMyView();
   } else {
      displayModelIndexInMyView(selection.indexes().first());
   }
}

в коде выше,displayModelIndexInMyView(QModelIndex) должен быть заменен текущим слотом обработчика для activated(QModelIndex) и clearMyView() заменено на то, что вы хотите сделать когда ничего не выбрано.

есть много способов сделать это, и, честно говоря, я не уверен, что это канонический, но я думаю, что это сработает для вас.


другой способ-реализовать QListView::currentChanged(...) виртуальная функция.