要想长按删除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_OBJECTpublic:    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。
[ 此帖被jwchen08在2011-03-29 21:02重新编辑 ]