QTableView,ExtendedSelection模式下的条件行选择

时间:2013-06-05 11:27:01

标签: row selection qtableview selectionchanged

我在ExtendedSelection模式下使用QTableView和SelectItems行为 我想实现以下行为:
1)当只选择一个单元格时 - 什么都不做 2)当选择多个单元格时 - 为每个选定单元格选择完整行。

以下是一个例子:

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键选择不起作用。当按下Shift键的选择区域被更改时deselected始终为空。所以选择总是增加。

实施所述行为的更好解决方案是什么? 如何使用按下的Shift键修复选择?

1 个答案:

答案 0 :(得分:0)

我找到了另一个解决方案。

我重新实现了select() QItemSelectionModel方法。比足以做一些检查并将Rows标志添加到初始标志。