天天看点

Qt中QListWidget、QTableWidget、QTreeWidget的增删改查操作

其实,关于这个东西一直想写,但是因为懒,就一直没动笔(捂脸)。

话不多说,进入正题。

对于QListWidget、QTableWidget、QTreeWidget这三个widget来说,它们几个是Model/View的特殊化,使用较为简单。

就这三个窗口的使用来个汇总,详见下方。

有一点说明一下,这里仅仅列举常用的方法,并且仅仅写了个方法名字,具体的参数以及返回值之类的,需要去好好看看手册。

1.QListWidget

QListWidget的使用较为简单,这是一种最简单的widget类型。

  • 增:

    常用的方法有

    addItem、addItems、insertItem、insertItems(具体的使用详见手册)

    其中addItem以及addItems常在初始化的时候使用,如果在平常情况下使用这两个函数,则是在列表末尾处开始添加。insertItem以及insertItems可以在任意位置添加。

  • 删:

    删除的方法比较头痛

    手册中建议的方法是takeItem,这个函数的作用是从列表中删除指定行的元素(实际上不是删除,应该叫剪切),然后可以获得这个元素,但是原先列表中的该元素则消失(与剪切非常相似)。

    除此之外,还可以通过获取指定元素的方法,手动删除掉。

    比如currentItem、item、itemAt等函数均可获得指定的元素(详见手册),获取之后delete就可以实现删除了。

    如果是删除整个列表,可以使用clear函数。

  • 改:

    enmm,这个东西的话,方法就比较多了。

    比如可以直接设置窗口的可编辑,或者是获得指定元素后,通过setText的方式更改文本显示。

    这个根据自己的喜好以及项目要求,自己决定吧,就不细写了。

  • 查:

    emmm,这个就更没啥了,列表的查询非常简单。

    一个是查询当前元素或者是当前行,可以使用currentItem、currentRow直接获得当前元素或者是当前行。

    另一个是查询指定位置的元素,可以使用item或者是itemAt函数获得。

2. QTableWidget

对于QTableWidget,这是一个使用频率相当高的控件(在小数据量情况下),这个东西的使用也是比较简单的。

  • 这个方法也是超多的。

    对于初始化而言,常用的方法是使用setRowCount以及setColumnCount直接设定好行数以及列数,然后在设定好的表格中添加QTableWidgetItem元素,然后就可以使用了。

    对于中间的添加,常用的方法是insertRow以及insertColumn函数,用来增加行列,这个东西不需要手动添加item元素,因为默认就已经有元素了,仅仅对其进行操作即可。

  • 对于表格而言,因为很多操作都是针对于一行或者是一列而言的,所以删除的话,可以采用removeRow以及removeColumn来实现整行整列的删除动作。

    如果是要删除某个元素,同QListWidget类似,仍然可以使用takeItem函数来删除指定位置的元素。或者是使用诸如currentItem、item、itemAt等函数获得指定位置的元素,然后手动delete掉。

    如果是删除整个表格,可以使用clear函数。

  • emmm,同列表类似,可以通过设置表格的可编辑,以及获取指定位置的元素,然后使用setText重新赋值即可。

  • 查的话,也同列表类似,使用row、column、currentRow、currentColumn获得期望的行列;使用item,itemAt、currentItem获取期望的元素。

3. QTreeWidget

好了,终于到了比较头痛的树形控件了,这个同上面的列表以及表格有着很大的不同。

对于列表以及表格来说,它们基本上的检索都是独立的,可以不依赖于其他的元素而存在,因此这两个窗口可以单独设置某个元素。

但是树不一样,每棵树都有一个根节点,它的所有子节点都依附于这个根节点,如果这个根节点没有了,那么它所有的子节点,以及子节点的子节点将全部消失。

所有的操作都依赖于这个根(或者说是每个根节点),理论上可以有无限个跟节点,但是也可以理解为所有的跟节点有一个总的root节点(看不见,但是应该有,这点我需要去看看源码的实现,然后后面确定了,这里再更新一下)。

所以,下面的增删改查操作,就要分为“根节点”以及“子节点”来分别进行(有些操作可以不这么划分,后面再细说)。

这里需要说明一个概念,“根节点”以及“子节点”的概念是相对的,一个节点既可以是“根节点”,也可以是“子节点”,这需要考虑到它的相对位置。

但是需要明确一个概念,就是“顶层根节点”,这个东西,每一个枝干上只有唯一的“顶层根节点”,也就是说这个“顶层根节点”是唯一标识的。

  • 对于增加“顶层根节点”,可以使用addTopLevelItem、addTopLevelItems来进行添加。

    对于它的“子节点”,则需要在获得根节点的情况下,使用addChild、addChildren函数进行添加。

    也可以使用insertChild、insertChildren函数在指定位置添加。

    子节点如果想要添加子节点,也是需要通过addChild、addChildren函数进行添加,因为相对于它的子节点而言,这个节点已经变成了“根节点”。

  • 对于删除操作,可以采用takeTopLevelItem函数,删除(剪切)某个指定的“顶层根节点”,这种方法仅仅适用于“顶层根节点”,对于普通的节点,我暂时没有找到类似的方法。

    还有一个通用的方法,就是直接获得指定的节点(无论是普通的节点,还是“顶层根节点”),然后手动delete掉。

    这里需要注意的是,如果删除的这个节点有子节点,则它的子节点在其被删除的时候,也会被删除掉(严格来讲,是在其被删除之前就已经被删除掉了,因为需要事先遍历它的所有子节点,以及子节点的子节点,然后从叶子结点的位置开始删除,一点点往上,直至删除掉这个节点)。

    如果想要删除它的子节点,可以使用removeChild函数进行删除(虽然这玩意一次只能删除一个子节点)。

  • 这个就可以通过获得指定元素,然后使用setText的方式进行更改,也可以设置树的可编辑。

  • 可以使用itemAt,currentItem来获得元素,如果想要知道它的子节点,也可以在获得这个元素后,使用childCount函数获得子节点的数目,然后使用child获得指定的子节点。

总结:

这三个窗口,有着不同。但是因为都是简化的Model/View,所以有着共通之处,就是“行”、“列”,以及元素嵌套在view中,数据都是以item的形式存储的,绝大多数的操作也都是针对item的,一定要明确这一点。(有兴趣的,可以去看看源码)

这三个窗口的添加元素比较简单,但是删除某个元素一般的方法是获得指定位置的元素,然后delete之。

继续阅读