QTableView组合键Shift多选以及拖动多选(以日历的方式展示)

代码是从一个完整的工程里面抽取出来的,所以有些地方可以根据需要修改,QTableView/QTableWidget都能适用

我们在特定的需求下(日历日程的)需要连续选中的一些Item,而Qt默认的只能选中N行或者N列,如图

QTableView组合键Shift多选以及拖动多选(以日历的方式展示)_第1张图片

 

下面看一下处理过后的效果图:

QTableView组合键Shift多选以及拖动多选(以日历的方式展示)_第2张图片

接下来就是代码了,很简单的以后工程,后面会放工程代码的链接

1、选中firstIndex到lastIndex中间的所有item

void W_TableScheduleMonth::selectIndexs(QModelIndex firstIndex , QModelIndex lastIndex)
{
    W_TableScheduleMonthItem * firstItemWidget =this->getWItem(firstIndex.row() , firstIndex.column());
    W_TableScheduleMonthItem * lastItemWidget = this->getWItem(lastIndex.row() , lastIndex.column());
    if(firstItemWidget && lastItemWidget){
        QList lsItem = m_mapItem.values();//保存了所有的item根据日期排序
        int firstIndexForItems = lsItem.indexOf(firstItemWidget);//当前点击的item在所有item中的index
        int lastIndexForItems = lsItem.indexOf(lastItemWidget);//已选中的第一个item在所有item中的index
        if(firstIndexForItems > -1 && lastIndexForItems > -1){
            int startIndex = qMin(firstIndexForItems , lastIndexForItems);
            int endIndex = qMax(firstIndexForItems , lastIndexForItems);
            this->selectionModel()->clear();
            while(startIndex <= endIndex){
                W_TableScheduleMonthItem * witem = lsItem.at(startIndex);
                if(witem){
                    QModelIndex index = this->model()->index(witem->row() , witem->column());
                    if(index.isValid()){
                        this->selectionModel()->select(index, QItemSelectionModel::Select);//选中列表
                    }
                }
                startIndex++;
            }
        }
    }
}

2、重写mousePressEvent

void W_TableScheduleMonth::mousePressEvent(QMouseEvent *event)
{
    if(qApp->mouseButtons() == Qt::LeftButton){//只处理左键
        QModelIndex index = this->indexAt(event->pos());
        if(index.isValid()){//选中的item是有效的
            if(qApp->keyboardModifiers().testFlag(Qt::ShiftModifier) == true){//处理shift组合键
                selectIndexs(index , m_curPressedModelIndex);
            }else if(qApp->keyboardModifiers().testFlag(Qt::ControlModifier) == true){//不处理ctrl组合键
                return ;
            }else{//单击事件交给父类默认处理
                m_bMousePressed = true;
                m_curPressedModelIndex =index;
                QTableWidget::mousePressEvent(event);
            }
        }
    }
}

3、重写mouseMoveEvent和mouseReleaseEvent(为了实现拖动选中)

void W_TableScheduleMonth::mouseMoveEvent(QMouseEvent * event){
    if(m_bMousePressed){
        QModelIndex index = this->indexAt(event->pos());
        if(index.isValid() && m_curPressedModelIndex.isValid()){//选中的item是有效的
            selectIndexs(index , m_curPressedModelIndex);
            return ;
        }
    }
    return QTableWidget::mouseMoveEvent(event);
}

void W_TableScheduleMonth::mouseReleaseEvent(QMouseEvent * event)
{
    m_bMousePressed = false;
    return QTableWidget::mouseMoveEvent(event);
}

下载地址:点击下载

你可能感兴趣的:(Qt,Windows开发,C++,Qt日历,QTableView多选,QTableWidget,QTableView拖动多选)