2013-03-05 3 views
10

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

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

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

ответ

20

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

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

+0

Спасибо за ответ, но я могу получить сигнал/слот для подключения. Во время выполнения я получаю следующую ошибку: «Нет такого слота ConnectDialog :: handleSelectionChanged (QItemSelection)». Функция существует и выглядит так же, как ваши ... любые идеи? –

+0

Вы помещали его под 'частные слоты:', когда вы объявили его в заголовке? – cgmb

+0

D'oh ... Нет, я этого не делал. Спасибо вам за помощь! –

0

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