代碼是從一個完整的工程裏面抽取出來的,所以有些地方可以根據需要修改,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);
}
下載地址:點擊下載