QT5 QtreeWidget 实现点击item事件以及右键菜单删除item 和 重命名item

1、new 一个QTreeWidget 对象,并设置头标签,和根节点(个人程序需要)

   

   QTreeWidget* treeWidget = ui.treeWidget;//我已经在ui设计师中拖了一个QTreeWidget

    QString headers;
    headers  = "Name" ;
    treeWidget->setHeaderLabel(headers);

    QStringList rootText;
    rootText  << "wells";
    root = new QTreeWidgetItem(treeWidget, rootText);        

2、添加 QTreeWidgetItem(这里是读取文件夹里文件的名字作为item的名字)

    for(int i = 2;i < fileList.size();i++)
    {
        
        QTreeWidgetItem *leaf = new QTreeWidgetItem(root, QStringList() <<fileList.at(i).fileName());
        leaf->setFlags(leaf->flags() | Qt::ItemIsEditable);  
        root->addChild(leaf);
    }

3、点击item事件

 

connect(treeWidget,SIGNAL(itemClicked(QTreeWidgetItem*,int)), this,SLOT(checkself(QTreeWidgetItem* ,int)));//检测点击事件,信号槽机制

4、checkself(QTreeWidgetItem* ,int);函数是点击后的响应函数。在private slot:  下声明(这里的具体实现就不贴了)

5、右键弹出菜单

connect(treeWidget,SIGNAL(customContextMenuRequested(const QPoint&)), this,SLOT(popMenu(const QPoint&)));//检测鼠标右键

6、弹出菜单的响应函数  popMenu(const QPoint&)

void LWD::popMenu(const QPoint&)
{
    QTreeWidgetItem* curItem=treeWidget->currentItem();  //获取当前被点击的节点
    if(curItem==NULL)return;           //这种情况是右键的位置不在treeItem的范围内,即在空白位置右击
    QString wellName = curItem->text(0);
    if(wellName != "wells")
    {
        QAction deleteWell(QString::fromLocal8Bit("&删除该井"),this);//删除井
        QAction reNameWell(QString ::fromLocal8Bit("&重命名井"),this);//重命名井
        //在界面上删除该item
        connect(&deleteWell, SIGNAL(triggered()), this, SLOT(deleteItem()));
        connect(&reNameWell,SIGNAL(triggered()),this,SLOT(renameWell()));
        
        QPoint pos;
        QMenu menu(ui.treeWidget);
        menu.addAction(&deleteWell);
        menu.addAction(&reNameWell);
        menu.exec(QCursor::pos());  //在当前鼠标位置显示
        
    }
}

7、deleteItem()

void LWD::deleteItem()
{
    root->removeChild(treeWidget->currentItem());
    if(myW != NULL)
    {
        myW->setParent(NULL);
        ui.verticalLayout_4->removeWidget(myW);
    }
    //删除井数据文件
    QString dirPath = "../Data1/";
    dirPath.append(treeWidget->currentItem()->text(0));
    dirPath.append("/");
    DeleteDirectory(dirPath);//实现在下面

}
bool LWD::DeleteDirectory(const QString &path)
{
    if (path.isEmpty())
        return false;

    QDir dir(path);
    if(!dir.exists())
        return true;

    dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
    QFileInfoList fileList = dir.entryInfoList();
    foreach (QFileInfo fi, fileList)
    {
        if (fi.isFile())
            fi.dir().remove(fi.fileName());
        else
            DeleteDirectory(fi.absoluteFilePath());
    }
    
    return dir.rmpath(dir.absolutePath());
}

8、renameWell()

void LWD::renameWell()
{
    preName = treeWidget->currentItem()->text(0);
    prePath = "../Data1/";
    prePath.append(preName);
    ui.treeWidget->editItem(ui.treeWidget->currentItem());
    //t通过监控itemChanged事件来确定修改后的名字!!!!
    connect(treeWidget,SIGNAL(itemChanged( QTreeWidgetItem *,int )),this,SLOT(nameChanged(QTreeWidgetItem*  )));
    
}

void LWD::nameChanged(QTreeWidgetItem* item)
{
    //先重命名文件夹
    QString newName = treeWidget->currentItem()->text(0);
    QString newPath = "../Data1/";
    newPath.append(newName);
    QFile::rename(prePath,newPath);
    prePath = newPath.append("/");
    prePath.append(preName);
    prePath.append(".txt");
    //重命名井眼轨迹处理后的文件
    newPath.append("/");
    newPath.append(newName);
    newPath.append(".txt");
    QFile::rename(prePath,newPath);

}

 

posted @ 2016-05-17 22:30  Lynn4321  阅读(35286)  评论(2编辑  收藏  举报