У меня есть QDialog, созданный с помощью QT Designer, который выглядит так:
Список серверов слева представляет собой QListView с QStringListModel. Щелчок мышью по элементу в представлении списка обновляет форму с информацией для выбранного элемента, подключая сигнал активированного представления (QModelIndex) к функции слота в диалоговом окне.
Однако нажатие вверх или вниз на клавиатуре также изменяет выбранный элемент, но сигнал не подается, поэтому форма не обновляется в соответствии с выбранным элементом. Как это можно исправить?
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(...)
виртуальная функция.