天天看點

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之。

繼續閱讀