2013-06-05 3 views
0

Я использую QTableView в режиме ExtendedSelection с поведением SelectItems.
Я хотел бы реализовать следующие действия:
1) Когда выбрана только одна ячейка - ничего не делать
2) Когда выбрано более одной ячейки - выберите полную строку для каждой выбранной ячейки.QTableView, условный выбор строки в режиме ExtendedSelection

Вот пример:

void BaseTableView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) 
{ 
    QTableView::selectionChanged(selected, deselected); 
    QItemSelection currentSelection = selectionModel()->selection(); 

    //table has selection 
    if(!currentSelection.isEmpty()) 
    { 
     QItemSelectionRange selectionRange = currentSelection.first(); 

     //select whole row if more than one cell is selected 
     if(currentSelection.count() > 1 || selectionRange.height() > 1 || selectionRange.width() > 1) 
     { 
      if(!deselected.isEmpty()) 
       selectionModel()->select(deselected, QItemSelectionModel::Deselect | QItemSelectionModel::Rows); 
      if(!selected.isEmpty()) 
       selectionModel()->select(currentSelection, QItemSelectionModel::Select | QItemSelectionModel::Rows); 
     } 
    } 
} 

Этот код как-то работает. Но я не могу найти лучшего решения.
Проблемы:
1) Мигание выбора при использовании мыши. Возможно, из-за двойного вызова selectionChanged или что-то в этом роде.
2) Выбор с помощью клавиши Shift не работает должным образом. При изменении области выбора с нажатой клавишей сдвига deselected всегда пуст. Поэтому выбор всегда увеличивается.

Что такое лучшее решение для реализации описанного поведения?
Как исправить выбор нажатием клавиши Shift?

ответ

0

Я нашел другое решение.

Я повторно реализовал select() метод QItemSelectionModel. Достаточно сделать чек и добавить флаг Rows к исходному флагом.

Смежные вопросы