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

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

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

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

Ответ 1

Сигнал 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() заменен тем, что он хочет сделать, когда ничего не выбрано.

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

Ответ 2

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