功能内容:
1、实现右击菜单(重点:如何只在Item项上面弹出右击菜单,而在空白处不弹出菜单)
2、实现重命名功能
3、使用使用委托类实现对重命名检查,后缀名更改时给予警告
最后在编译程序时出现了2个编译错误(检查老半天才把问题纠察出来)。把相关错误写出来,给以后做参考!
1 实现右击菜单
网上有很多资料讲解了右击菜单的实现。但大多数都是基于QListWidget视图,本人实现的浏览器是QtreeView视图,所以相对来说有部分不同。但都是大同小异。
实现右键菜单, 必须重写下面这个函数
void QWidget::contextMenuEvent ( QContextMenuEvent * event ) [virtual protected]
这个函数是QWidget的一个虚函数,使用时必须由QWidget的子类重写该函数。
本文中该函数的重新如下:
//实现右击菜单
void fileView::contextMenuEvent(QContextMenuEvent *event)
{
QMenu* popMenu = new QMenu(this);
QModelIndex currIndex=this->tree->indexAt(tree->viewport()->mapFromGlobal(event->globalPos()));
int i=currIndex.row();
// qDebug()<<"right:"<<i;
if(i!=-1)
{
QAction *Rename=new QAction(QObject::tr("Rename"),this);
popMenu->addAction(Rename);
connect(Rename,SIGNAL(triggered(bool)),this,SLOT(slotRename()));
}
popMenu->exec( QCursor::pos() );
}
说明:该函数实现与参考文献1中最大的差别就是关于通过鼠标位置确定来获取当前所对应的项。在QtreeView中没有ItemAt(widget_pos)函数,取而代之的是indexAt(viewport_pos)函数 该函数返回当前的模式索引QModelIndex.括号里的坐标参数也不一样 indexAt参数为视口坐标参数 Qt文档中indexAt()解释: