要想长按删除QListWidget的Item,必须重写鼠标事件,所以需要继承QListWidget重写自己的MyListWidget。分享一下我写的类:

//.h文件
#ifndef CJWLISTWIDGET_H

#define CJWLISTWIDGET_H


#include<QApplication>

#include<QWidget>

#include<QListWidget>

#include<QMenu>

#include<QAction>

#include<QTime>

#include<QList>


class CjwListWidget : public QListWidget

{

Q_OBJECT

public:

explicit CjwListWidget(QWidget *parent = 0);


private:

QTime *time;

QAction *action;

void mousePressEvent(QMouseEvent *event);

void mouseReleaseEvent(QMouseEvent *e);


signals:


public slots:

void deleteItemAt();


};


#endif // CJWLISTWIDGET_H



//.cpp文件

#include "cjwlistwidget.h"

#include<QMessageBox>


CjwListWidget::CjwListWidget(QWidget *parent):

QListWidget(parent)

{

time=new QTime(0,0,0,0);


action=new QAction(tr("删除"),this); //删除事件

connect(action,SIGNAL(triggered()),this,SLOT(deleteItemAt()));

}


void CjwListWidget::mousePressEvent(QMouseEvent *event)

{

time->start();

if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则选中

{

itemAt(mapFromGlobal(QCursor::pos()))->setSelected(true);

}

}


void CjwListWidget::mouseReleaseEvent(QMouseEvent *e)

{

if(time->elapsed()>1000)

{

if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加"修改"菜单

{

QMenu* popMenu = new QMenu(this);

popMenu->addAction(action);

popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置

}

}

}


void CjwListWidget::deleteItemAt()

{

QList<QListWidgetItem*> list=this->selectedItems();

if(list.size()==0)

return;

QListWidgetItem* sel=list[0];

if(sel)

{

int r=this->row(sel);

delete takeItem(r);

}

}



需要注意的有三点:

1、删除Item需要使用函数takeItem而不是removeItemWidget。

2、要想删除选中的项,由于Qt4中取消了selectedItem()函数,所以需要使用

    QList<QListWidgetItem*> list=this->selectedItems();

3、QListWidget的item编号是从0开始的,即第一项的row是0。