Qt QTreeWidget节点的添加+双击响应+删除详解

Qt QTreeWidget节点的添加+双击响应+删除详解

发布时间:2012-08-09 发布来源:

int main()
{
     int U,V,co;//主函数的变量不要和上方的函数反复了。。
  char c;
     while(cin>>n>>np>>nc>>m)
  {
         memset(adj,-1,sizeof(adj));//必然要记得初始化。。
   num=0;
         while(m--)
   {
    while(c=getchar())    
    {    
     if(c==""("")     
      break;    
    } 
    cin>>U;
    getchar();
    cin>>V;
    getchar();
    cin>>co;
    (U+1,V+1,co);          
         }
   temp=n+1;
   n+=2;
   m+=(np+nc);
   s=0;  
   t=temp;
   while(np--)
   {
    while(c=getchar())    
    {    
     if(c==""("")     
      break;    
    } 
             cin>>U;
    getchar();
    cin>>co;
    (0,U+1,co);
   }
   while(nc--)
   {
    while(c=getchar())    
    {    
     if(c==""("")     
     break;    
    }  
             cin>>U;
    getchar();
    cin>>co;
    (U+1,temp,co);
   }    
         cout<
     }
     return 0;
}*/

没有幻想,就达不到目标;没有大胆,就得不到器材。承接该文http://www.cnblogs.com/Romi/archive/2012/04/16/2452709.html,在该文根蒂根基上持续讲解QTreeWidget控件的应用,同时解决该文最后留下的题目。

人们啊,你们在你们的自身之中寻找对你们的那种可悲的解救之道,那是枉然的.你们全部的光亮所能达到的只不过是熟悉到,你们毫不会在你们自身之中找到真谛或者美好QTreeWidget是实现树形布局的类,在很多软件中都可以看到类似树形布局的界面。

我做的一个示例如下图,用来处理惩罚图像,最顶层节点是图像的路径名,子节点是图像的各个波段,双击各个波段会显示图像各波段的灰度图像,同时还有删除指定节点(父节点和子节点同时删除)的功能。结果如下所示

要完成如许的功能须要重视一下几点:

①.在内存中保存各个节点,当然要在堆上分派内存,删除节点时,除了去除QtreeWidget控件上的节点外,还要讲存储在内存中的节点也要删除,不然会呈现内存泄漏的题目。

②.节点双击的事务响应,准断定位到是哪个图像的哪个波段。

下面具体论述。

1.变量

须要有个变量记录图像的路径名,这里定义一个容器,数据类型为QString

QVector imgFile;

2.定义旌旗灯号和槽

须要三个槽,

打开菜单:每应用打开菜单打开一幅图像就将该图像的路径名和波段数设计成父节点和子节点添加到QTreeWidget控件中。

删除节点的按钮:删除指定节点(该节点处于高亮状况,即选中状况)

双击某波段:显示该波段的灰度图像。

这里侧重讲解与QTreeWidget相干的,是以有关显示图像的内容概非论说。

旌旗灯号与槽链接如下:

打开菜单      connect(ui.Open,SIGNAL(triggered()),this,SLOT(menu_Open()));

双击某波段   connect(ui.treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(showSelectedImg(QTreeWidgetItem*,int)));

删除节点      connect(ui.DeleteNode,SIGNAL(clicked()),this,SLOT(btn_DeleteNode()));

3.打开图像(添加节点)

    imgFile.append(fileName);//影像路径添加进容器
    QTreeWidgetItem *item=new QTreeWidgetItem(ui.treeWidget,QStringList(QString(fileName)));//添加节点
    //添加子节点
    forint i=0;i)
    {
        QTreeWidgetItem *item1=new QTreeWidgetItem(item,QStringList(QString("Band")+QString::number(i+1)));
        item->addChild(item1);
    }

此中rasterNum为路径名为fileName的图像的波段数。

如许在QTreewidget部件对象treeWidget中就增长了树节点及其子节点。每次打开都邑在树形节点最后面添加。

这里须要提示一点:这里的QTreewidgetItem指针对象指向的地址都分派在堆上,会不会造成内存泄漏呢?因为函数停止后作为局部变量的指针当然是消散了,但保存QTreeWidgetItem节点的内存地址还在,有没有办法在须要的时辰将其内存地址开释掉呢,答案是必然的,将在后面删除节点时论说。

4.双击某波段显示波段图像

        QTreeWidgetItem *parent=item->parent();//获得父节点
    if(NULL==parent)
        return;
    progessBar->setValue(0);//进度条置0
    int row=parent->indexOfChild(item);//获得节点在父节点中的行号(从0开端)
    QString fileName=parent->text(0);//获得父节点的文本字符(即影像路径)
    /* QString->const char* */
    QByteArray ba=fileName.toLocal8Bit();
    const char* filePath=ba.data();

这里贴出的是找到图像路径和子节点波段的办法,至于显示出图像就是按照图像路径和波段号显示出波段响应灰度图像,该题目不在评论辩论局限,略去。

5.删除节点

这里的删除节点不是删除所有节点,而是删除与该节点有关的图像的所有节点,比如,鼠标指向了最开端图中第二个父节点的随便率性一个子节点,则就将该父节点和所有子节点删除。

    QTreeWidgetItem* item=ui.treeWidget->currentItem();//获合适前节点
    if(NULL==item)//没有选择节点
        return;
    QTreeWidgetItem* parent=item->parent();//获合适前节点的父节点
    int index;//top节点的索引号
    if(NULL==parent)//item就是top节点
    {
        QString fileName=item->text(0);//获得top节点的文本字符(即影像路径)
        forint i=0;i)
        {
            if (fileName==imgFile.at(i))
            {
                index=i;
                break;
            }
        }
        ui.treeWidget->takeTopLevelItem(index);//去除节点 Removes the top-level item at the given index in the tree and returns it
        imgFile.remove(index);//移除容器index处内容

        //开释掉存放节点的内存空间
        int childCount=item->childCount();//子节点数
        forint i=0;i)
        {
            QTreeWidgetItem* childItem=item->child(0);
             childItem;
            childItem=NULL;
        }
         item;
        item=NULL;
    }
    else//parent才是top节点
    {
        QString fileName=parent->text(0);//获得top节点的文本字符(即影像路径)
        forint i=0;i)
        {
            if (fileName==imgFile.at(i))
            {
                index=i;
                break;
            }
        }
        ui.treeWidget->takeTopLevelItem(index);//去除节点 Removes the top-level item at the given index in the tree and returns it
        imgFile.remove(index);//移除容器index处内容

        //开释掉存放节点的内存空间
        int childCount=parent->childCount();//子节点数
        forint i=0;i)
        {
            item=parent->child(0);
             item;
            item=NULL;
        }
         parent;
        parent=NULL;
    }

首要办法就是按照图像路径名获得图像在top节点中的索引号,然后将top节点及其子节点删除,采取takeTopLevelItem(index)办法可以把treeWidget中的所因为index的节点去除掉,重视这里只是将节点从treeWidget中去除掉,其节点(父节点+子节点)仍然存在内存中,所以还要讲内存中的地址也要开释掉,不然就会呈现所谓的内存泄漏的题目。所采取的办法时应用QTreeWidgetItem指针找到存放节点的内存地址,然后将其掉,如此就开释掉内存空间了(有疑问的可以跟踪调试下),必然重视将要删除的节点全部掉,先开释子节点内存,再开释父节点内存

还须要重视的是,每清除掉一个子节点的内存空间,对应父节点就会落空该子节点,是以每次都是清理掉父节点索引为0的子节点,即获得child(0)的子节点。此外不要忘了保存图像路径的向量imgFile中也要去除对应的索引内容。

总结

以上给出的是实现功能的核心实现项目组,并非完全的法度,其他未论说的都是与QTreeWidget该控件无关的了。上述办法可移植性强,可以用到有类似需求的处所。别林斯基

《更多网站建设信息、网站开发资讯,敬请咨询百微信息科技,021-57700304》

你可能感兴趣的:(Qt)