要想长按删除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重新编辑 ]