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

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

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

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

3 ответа

Решение

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(...) виртуальная функция.

Я бился и над подобным случаем с Qt6. В дополнение к принятому ответу я предлагаю это с новым синтаксисом (пример не проверен):

      MyView::MyView() {
   QListView* view = new QListView(this);
   connect(view->selectionModel(), 
      &QItemSelectionModel::currentChanged, 
      this, &MyView::handleSelectionChanged);
}

...

MyView::handleSelectionChanged(
        const QItemSelection& selection,
        const QItemSelection& before){
   if(selection.indexes().isEmpty()) {
      clearMyView();
   } else {
      displayModelIndexInMyView(selection.indexes().first());
   }
}
Другие вопросы по тегам