2010-01-26 52 views
9

我有以下QT模型/視圖框架的問題。我想在一個表視圖項中渲染一個小部件。如何在QT中的樹視圖項目中呈現複雜的小部件?

首先我想到的是使用

void QAbstractItemView::setIndexWidget(const QModelIndex & index, QWidget * widget) 

但對於這個函數的文檔明確規定:

此功能只能用於 顯示靜態內容中對應 可見區域數據項目 。如果要顯示自定義 動態內容或實現自定義 編輯器窗口小部件,請改爲QItemDelegate的子類 。

所以他們建議在這裏使用代表。那麼,迄今爲止這麼好。我知道可以使用代表創建一個編輯器,這可能基本上是任何QT小部件。但是這裏存在這個問題 - 我不希望這個小部件成爲編輯器 - 我想要使用這個小部件始終呈現該項目。而不僅僅是「呈現」,我需要它具有小部件的確切行爲。

現在我想使用的小部件是一個自定義小部件,它是一些其他小部件(幾個複選框,幾個帶有一些佈局的按鈕)的容器。

我認爲解決的辦法是這樣的:

  1. 抓住我的自定義部件的外觀的像素圖。
  2. 讓委託使用此像素圖繪製自己。
  3. 當鼠標移動到某個項目使視圖自動啓動編輯(我不
    知道如何做到這一點,但我想這是可能的)
  4. 讓委託創建我的窗口小部件的編輯器一個物品。

此解決方案似乎可行,但對我來說味道不好。任何人都可以爲這個問題提供更優雅的解決方案?

謝謝。

+0

你是什麼意思「我需要它具有小部件的確切行爲? – 2010-01-26 19:59:01

+0

我的意思是與用戶進行交互 - 對其行爲做出反應 – Lev 2010-01-26 20:55:59

+0

你想要什麼樣的交互?一個細胞,它不是,所以我有一個很難想象你真正想要在交互方式的控件。 – 2010-01-26 21:40:24

回答

7

Delegates負責creating editors以及做所有必要的顯示。他們可能會使用樣式來完成大部分繪畫,如繪製進度條或手動繪製。

但是,代表不是小工具。除非編輯器已被調用,否則它無法訪問小部件的大部分內容。兩者非常不同,目的不同,並且完成不同的事情。

代表最麻煩的一個方面是他們是靜態。除非模型中的某些東西觸發更新(或者將小部件配置爲監視懸停事件),否則委託不會用於重繪任何存在的數據 - 緩衝表示將被繪製到屏幕上。

儘管您可以通過一些自定義代碼(例如通過鼠標跟蹤)來處理它,但您可以通過edit triggers來調用編輯器。

+0

同意。所以基本上你說的,那我會往好的方向發展?順便說一句,懸停事件將不幫助我在這裏,因爲小部件是隻有當編輯被觸發(在此之前,小部件不存在)的委託創建。 – Lev 2010-01-26 20:15:18

+1

您可以使用組成,抱到小部件的引用,然後使用'QWidget的::渲染()'繪製到代理的paint方法中繪製的像素圖。 – 2010-01-26 21:39:18