問題:我想在視圖中顯示一個簡單的QStringListModel。但是,我希望視圖中的每個項目都是我創建的自定義QWidget。我不明白爲什麼這是一個很難的問題!我已經在互聯網上尋找解決方案,儘管我在這裏和那裏發現了點點滴滴,但沒有一個好的解決方案可以滿足我的所有需求。在Qt視圖中使用QWidget
設立我的模型/視圖的基本代碼:
QStringList strings;
// add some strings to the model
QStringListModel* model = new QStringListModel(strings);
QListView* view = new QListView;
view->setModel(model);
我已經在這樣做無濟於事嘗試過各種嘗試。
嘗試#1
我試着子類新QItemDelegate對象。在這個對象中,我重寫了創建編輯器的方法。我遵循了設置該代表的所有步驟。問題是,當模型填充視圖時,當我需要抓取Qt :: EditRole中的每個項目時,它會抓取模型中的每個項目在Qt :: DisplayRole中。
嘗試#2
我嘗試的另一種方法是子類而QListView,並重寫則setModel方法調用setIndexWidget對於模型中的每個項目。我的代碼看起來是這樣的:
void CustomListView::setModel(QAbstractItemModel* model)
{
QListView::setModel(model);
for (int i = 0; i rowCount(); ++i)
{
QModelIndex index = model->index(i, 0);
CustomWidget* widget = new CustomWidget;
setIndexWidget(index, widget);
}
}
這個工作,只要在列表視圖中添加我CustomWidget對象的每一行。爲了確保常規模型數據不會在我的CustomWidget對象下方顯示,我也重寫了CustomListView :: paintEvent(QPaintEvent * event),不做任何事情。再次,這工作。
但現在我的主要問題是,當列表顯示時,雖然我的CustomWidgets正確顯示,但列表的背景是純白色。我試着在CustomListView上調用setAutoFillBackground(false),但是什麼也沒做。我希望我的列表視圖具有透明背景。
對此問題的任何反饋意見將大大大大讚賞。我花了很多時間試圖讓這個工作!謝謝!
的塗料代碼因此,關於嘗試#2,我修復了背景問題。在我的CustomListView構造函數中,我調用了viewport() - > setAutoFillBackground(false)。我仍然喜歡這些方法或其他可能適用於這個問題的想法。 – Chris 2011-03-03 19:04:44
我認爲你應該堅持代表。你也應該發佈你的setEditorData()和setModelData()函數的源代碼。 – zkunov 2011-03-03 19:43:38
不幸的是,我不能讓我的列表中的所有項目都處於EditMode中,並使用委託中的createEditor()返回的QWidget。似乎一次只能有一個項目處於該模式。 – Chris 2011-03-03 21:14:53