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);

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM