QTableView組合鍵Shift多選以及拖動多選(以日曆的方式展示)

代碼是從一個完整的工程裏面抽取出來的,所以有些地方可以根據需要修改,QTableView/QTableWidget都能適用

我們在特定的需求下(日曆日程的)需要連續選中的一些Item,而Qt默認的只能選中N行或者N列,如圖

 

下面看一下處理過後的效果圖:

接下來就是代碼了,很簡單的以後工程,後面會放工程代碼的鏈接

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<W_TableScheduleMonthItem*> 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);
}

下載地址:點擊下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章