如何使用Model View delegate自定义列表

如何使用Model View delegate自定义列表

简介

这是一个演示Model/View Programming 中自定义model,自定义delegate用法的程序。 通过自定义的model,delegate,实现自定义的列表元素。目标是构造一个列表,其中每个列表元素包含若干图片,文字, 按钮等。要实现这样的功能,第一反应是 自己定义一个widget,把图片文字控件放在里面加上layout, 然后再用使用void QAbstractItemView::setIndexWidget,加LlistView或TableView里面。 当界面元素固定,少量的时候,这是首选,但是要看到setIndexWidget帮助文档里面的警告,这样做是有效率代价的,如果列表有100项,那么就要加入100个widget, 很大的消耗。 使用delegate的话你可以只是paint 每个元素, 在需要操作的时候才构建真正的控件,而画控件可以用QStyle::drawControl() 画出来,当然这样做你需要构造,自己的model,delegate, 自己做数据绑定。 这样做效率很高,因为只有当前的控件是真的,其他都是画上去的! 好了动机大概是这样,下面详细介绍如何做。

开始

  • 关于Model/View Programming的使用,最好的文档当然是Qt自己的帮助,建议先通读一遍, 同时参考Qt中的例子:
  • StringListModel :位于doc\src\snippets\stringlistmodel, 这个例子的代码都在帮助的 Creating New Models这一章,建议阅读的时候顺手做一下,而我下面的例子是在这个例子基础上改成的。
  • SpinBoxDelegate:这个例子用以演示 如何自定义delegate, 来实现自定义的表元素,每个列表元是个spinbox, 可以编辑。这个例子解释了自定义delegate 的方方面面,但是用的model 是框架自带的
  • PixelDelegate: 这是个很漂亮的例子,演示了model view delegate的强大威力,其model 和delegate的自定义程度很高,演示了model和delegate之间的数据交互。遗憾的是这是个只读的例子,就是说并不能通过model改变data。
  • StarDelegate: 这个例子演示了如何定制delegate, 使用了自定义的数据结构,和编辑器,效果很强大,我们的自定义控件也期望这个目标。遗憾是没有定制model。
  • 我们期望自己的StarDelegatedelegate能画上图片等元素 如StarDelegate,PixelDelegate, 又能支持一些系统控件(button,checkbox...)如SpinBoxDelegate,但是上面三个强大的例子都没能完全达到这个目标,所以才写这篇文章。
  • 下面开始新建一个QT工程,选Mobile QT Application, 在ui中拖入一个ListView。

自定义model

为了说明问题,这里用最简单的数据结构,一个QStringList, model 是 数据的直接接口,有了String, 我们可以显示文字,也可以作为路径读取图片,在这个小例子中足够了。按照帮助中 Creating New Models的顺序,首先我们做一个只读的model, 在mainWindow.cpp中 对listview 加载model:

<span style="font-size:14px;">    parserModel <span class="sy0"><span style="color:#006e28;">*</span></span>model <span class="sy0"><span style="color:#006e28;">=</span></span> <span class="kw1"><strong>new</strong></span> parserModel<span class="br0"><span style="color:#006e28;">(</span></span>strings<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw1"><strong>this</strong></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>    ui<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">listView</span></span><span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">setModel</span></span><span class="br0"><span style="color:#006e28;">(</span></span>model<span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span></span></span>
只读的model

只读的model 只需要实现rowCount ,data 两个方法, 这里为ListView服务,所以我们继承QAbstractListModel, 如果用TableView的话,可以像PixelDelegate那样使用QAbstractTableModel。

<span style="font-size:14px;"><span class="kw2"><span style="color:#0057ae;">class</span></span> parserModel <span class="sy0"><span style="color:#006e28;">:</span></span> <span class="kw2"><span style="color:#0057ae;">public</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qabstractlistmodel.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QAbstractListModel</span></span></a>
<span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw2">Q_OBJECT</span>
<span class="kw2">public</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">:</span>
</span>    parserModel<span class="br0"><span style="color:#006e28;">(</span></span><span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstringlist.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStringList</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>strings<span class="sy0"><span style="color:#006e28;">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qobject.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QObject</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span>parent <span class="sy0"><span style="color:#006e28;">=</span></span> <span class="nu0"><span style="color:#b08000;">0</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//basic function for a read-only model</span>
</span>    <span class="kw4"><span style="color:#0057ae;">int</span></span> rowCount <span class="br0"><span style="color:#006e28;">(</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> parent <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span></span> <span class="br0"><span style="color:#006e28;">)</span></span> const</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qvariant.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QVariant</span></span></a><span style="font-size:14px;"> data <span class="br0"><span style="color:#006e28;">(</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">int</span></span> role <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">DisplayRole</span></span> <span class="br0"><span style="color:#006e28;">)</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span> 
<span class="kw2"><span style="color:#0057ae;">private</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">:</span>
</span>    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//simple data source just a QStringList, if need can add other list of QString, int, bool, struct or class</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qstringlist.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStringList</span></span></a><span style="font-size:14px;"> stringList</span><span style="color:#006e28;"><span style="font-size:14px;"><span class="sy0">;</span>
<span class="br0">}</span><span class="sy0">;</span></span></span>

想要 rowCount 能返回string list 中string的个数,所以我们这样写:

<span style="font-size:14px;"><span class="kw4"><span style="color:#0057ae;">int</span></span> parserModel<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">rowCount</span></span><span class="br0"><span style="color:#006e28;">(</span></span><span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>parent<span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    <span class="kw1"><strong>return</strong></span> stringList.<span class="me1"><span style="color:#2b74c7;">count</span></span></span><span style="color:#006e28;"><span style="font-size:14px;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
<span class="br0">}</span></span></span>

接下来关键的 data 函数,这个函数是 View 或 Delegate 获取数据的主要接口,我们想要显示文字,图片,都是从model中直接获得,我们这样写:

<a target=_blank href="http://doc.trolltech.com/latest/qvariant.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QVariant</span></span></a><span style="font-size:14px;"> parserModel<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">data</span></span><span class="br0"><span style="color:#006e28;">(</span></span><span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>index<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">int</span></span> role<span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    <span class="kw1"><strong>if</strong></span> <span class="br0"><span style="color:#006e28;">(</span></span> <span style="color:#006e28;"><span class="br0">(</span><span class="sy0">!</span></span>index.<span class="me1"><span style="color:#2b74c7;">isValid</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span> <span class="sy0"><span style="color:#006e28;">||</span></span> <span class="br0"><span style="color:#006e28;">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">row</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span></span> <span class="sy0"><span style="color:#006e28;">>=</span></span> stringList.<span class="me1"><span style="color:#2b74c7;">size</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>
</span>        <span class="kw1"><strong>return</strong></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qvariant.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QVariant</span></span></a><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span> 
    <span class="kw1"><strong>if</strong></span><span class="br0"><span style="color:#006e28;">(</span></span>role <span class="sy0"><span style="color:#006e28;">==</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span>
</span>    </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>        <span class="kw1"><strong>return</strong></span> stringList.<span class="me1"><span style="color:#2b74c7;">at</span></span><span class="br0"><span style="color:#006e28;">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">row</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">}</span>
</span>    <span class="kw1"><strong>else</strong></span> <span class="kw1"><strong>if</strong></span><span class="br0"><span style="color:#006e28;">(</span></span> role <span class="sy0"><span style="color:#006e28;">==</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="sy0"><span style="color:#006e28;">+</span></span><span class="nu0"><span style="color:#b08000;">1</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span>
</span>    </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>        </span><a target=_blank href="http://doc.trolltech.com/latest/qpixmap.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPixmap</span></span></a><span style="font-size:14px;"> pixmap</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>        pixmap.<span class="me1"><span style="color:#2b74c7;">load</span></span><span class="br0"><span style="color:#006e28;">(</span></span>stringList.<span class="me1"><span style="color:#2b74c7;">at</span></span><span class="br0"><span style="color:#006e28;">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">row</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>        <span class="kw1"><strong>return</strong></span> pixmap.<span class="me1"><span style="color:#2b74c7;">scaled</span></span><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">80</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> <span class="nu0"><span style="color:#b08000;">80</span></span><span class="sy0"><span style="color:#006e28;">,</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">KeepAspectRatioByExpanding</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">FastTransformation</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">}</span>
</span>    <span class="kw1"><strong>else</strong></span> <span class="kw1"><strong>if</strong></span><span class="br0"><span style="color:#006e28;">(</span></span> role <span class="sy0"><span style="color:#006e28;">==</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="sy0"><span style="color:#006e28;">+</span></span><span class="nu0"><span style="color:#b08000;">2</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span>
</span>    </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>        </span><a target=_blank href="http://doc.trolltech.com/latest/qpixmap.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPixmap</span></span></a><span style="font-size:14px;"> pixmap</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>        pixmap.<span class="me1"><span style="color:#2b74c7;">load</span></span><span class="br0"><span style="color:#006e28;">(</span></span>stringList.<span class="me1"><span style="color:#2b74c7;">at</span></span><span class="br0"><span style="color:#006e28;">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">row</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>        <span class="kw1"><strong>return</strong></span> pixmap.<span class="me1"><span style="color:#2b74c7;">scaled</span></span><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">20</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> <span class="nu0"><span style="color:#b08000;">20</span></span><span class="sy0"><span style="color:#006e28;">,</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">KeepAspectRatio</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">FastTransformation</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">}</span>
</span> 
    <span class="kw1"><strong>return</strong></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qvariant.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QVariant</span></span></a><span style="color:#006e28;"><span style="font-size:14px;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
<span class="br0">}</span></span></span>

这里默认是返回QVariant(), 关键是看中间返回的东西,必须结合后面的Delegate实现来一起看。 当delegate 或 view 询问数据的时候会传给data方法两个参数,就是问model要 位于 index这个地方的具有role数据,enum Qt::ItemDataRole 中常见的role是

  • Qt::DisplayRole 返回 QString 文字
  • Qt::DecorationRole 返回 QPixmap 图片

但是如果你想要返回另一幅图的话,就要用其他的role了,所以这里我全用 Qt::UserRole,来解释这个问题。 一个解释Qt::ItemDataRole 的例子是 Color Editor Factory,在这个例子中列表显示颜色和颜色名,都是从颜色名字符串中读数据,但是显示的时候一个是颜色方块,和名字,这就是同一个数据的两种表现形式,两个role。更进一步的,你可以在model中再引用一个struct 或者class Data, 当被询问不同的role的时候返回 Data.str1,或 Data.int2, 这样同一个index可以返回不同的数据,不同的数据类型。也可以是SQL查询的结果,在选择语句中传入不同的查询参数,这取决于你的数据结构,总之data被model 包装隔离了。不清楚没关系,下面我们看delegate如何数据。

自定义delegate

QT 4.6以后推荐自定义delegate 继承自QStyledItemDelegate,使用styleSheet来显示。不失一般性,这里先用QItemDelegate来说明问题。在mainWindow.cpp中 对listview 加载delegate:

<span style="font-size:14px;">    MyDelegate <span class="sy0"><span style="color:#006e28;">*</span></span>delegate <span class="sy0"><span style="color:#006e28;">=</span></span> <span class="kw1"><strong>new</strong></span> MyDelegate<span class="br0"><span style="color:#006e28;">(</span></span><span class="kw1"><strong>this</strong></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>    ui<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">listView</span></span><span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">setItemDelegate</span></span><span class="br0"><span style="color:#006e28;">(</span></span>delegate<span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span></span></span>
只读的delegate

先做只读的功能,需要重写 paint,和sizeHint 这个函数

<span style="font-size:14px;"><span class="kw2"><span style="color:#0057ae;">class</span></span> MyDelegate <span class="sy0"><span style="color:#006e28;">:</span></span> <span class="kw2"><span style="color:#0057ae;">public</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qitemdelegate.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QItemDelegate</span></span></a>
<span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw2">Q_OBJECT</span>
<span class="kw2">public</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">:</span>
</span>    <span class="kw2"><span style="color:#0057ae;">explicit</span></span> MyDelegate<span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qobject.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QObject</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span>parent <span class="sy0"><span style="color:#006e28;">=</span></span> <span class="nu0"><span style="color:#b08000;">0</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//basic function for a read-only delegate, you can draw anything with the painter</span>
</span>    <span class="kw4"><span style="color:#0057ae;">void</span></span> paint <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qpainter.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPainter</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> painter<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> const</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qsize.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QSize</span></span></a><span style="font-size:14px;"> sizeHint <span class="br0"><span style="color:#006e28;">(</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> const</span><span style="color:#006e28;"><span style="font-size:14px;"><span class="sy0">;</span>
<span class="br0">}</span><span class="sy0">;</span></span></span>

sizeHint用于指定绘制每个列表项的大小,关键是paint方法, 有了paint,我们就可以任意定制我们的列表

<span style="font-size:14px;"><span class="kw4"><span style="color:#0057ae;">void</span></span> MyDelegate<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">paint</span></span> <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qpainter.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPainter</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> painter<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitemv4.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItemV4</span></span></a><span style="font-size:14px;"> opt <span class="sy0"><span style="color:#006e28;">=</span></span> setOptions<span class="br0"><span style="color:#006e28;">(</span></span>index<span class="sy0"><span style="color:#006e28;">,</span></span> option</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">// prepare</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">save</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">// get the data and the rectangles</span>
</span>    <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qpixmap.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPixmap</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">&</span></span> pixmap <span class="sy0"><span style="color:#006e28;">=</span></span> qvariant_cast<span class="sy0"><span style="color:#006e28;"><</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qpixmap.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPixmap</span></span></a><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">></span><span class="br0">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">data</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="sy0"><span style="color:#006e28;">+</span></span><span class="nu0"><span style="color:#b08000;">1</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"> decorationRect <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span>opt.<span class="me1"><span style="color:#2b74c7;">rect</span></span>.<span class="me1"><span style="color:#2b74c7;">topLeft</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qsize.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QSize</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">80</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">80</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span> 
    <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstring.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QString</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">&</span></span> text <span class="sy0"><span style="color:#006e28;">=</span></span> index.<span class="me1"><span style="color:#2b74c7;">data</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="br0"><span style="color:#006e28;">)</span></span>.<span class="me1"><span style="color:#2b74c7;">toString</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qfontmetrics.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QFontMetrics</span></span></a><span style="font-size:14px;"> fm<span class="br0"><span style="color:#006e28;">(</span></span>painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">font</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"> displayRect <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span>decorationRect.<span class="me1"><span style="color:#2b74c7;">topRight</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">+</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qpoint.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPoint</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">20</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">30</span></span><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">,</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qsize.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QSize</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span>fm.<span class="me1"><span style="color:#2b74c7;">width</span></span><span class="br0"><span style="color:#006e28;">(</span></span>text<span style="color:#006e28;"><span class="br0">)</span><span class="sy0">,</span></span>fm.<span class="me1"><span style="color:#2b74c7;">height</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span> 
    <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qpixmap.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPixmap</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">&</span></span> pixmapSmall <span class="sy0"><span style="color:#006e28;">=</span></span> qvariant_cast<span class="sy0"><span style="color:#006e28;"><</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qpixmap.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPixmap</span></span></a><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">></span><span class="br0">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">data</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="sy0"><span style="color:#006e28;">+</span></span><span class="nu0"><span style="color:#b08000;">2</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"> smallIconRect <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span>opt.<span class="me1"><span style="color:#2b74c7;">rect</span></span>.<span class="me1"><span style="color:#2b74c7;">topRight</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">-</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qpoint.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPoint</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">100</span></span><span class="sy0"><span style="color:#006e28;">,-</span></span><span class="nu0"><span style="color:#b08000;">20</span></span><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qsize.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QSize</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">20</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">20</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span> 
 
    drawBackground<span class="br0"><span style="color:#006e28;">(</span></span>painter<span class="sy0"><span style="color:#006e28;">,</span></span> opt<span class="sy0"><span style="color:#006e28;">,</span></span> index</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">drawPixmap</span></span><span class="br0"><span style="color:#006e28;">(</span></span>decorationRect<span class="sy0"><span style="color:#006e28;">,</span></span> pixmap</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">drawText</span></span><span class="br0"><span style="color:#006e28;">(</span></span>displayRect<span class="sy0"><span style="color:#006e28;">,</span></span> text</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">drawPixmap</span></span><span class="br0"><span style="color:#006e28;">(</span></span>smallIconRect<span class="sy0"><span style="color:#006e28;">,</span></span> pixmapSmall</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    drawFocus<span class="br0"><span style="color:#006e28;">(</span></span>painter<span class="sy0"><span style="color:#006e28;">,</span></span> opt<span class="sy0"><span style="color:#006e28;">,</span></span> displayRect</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">// done</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">restore</span></span></span><span style="color:#006e28;"><span style="font-size:14px;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
<span class="br0">}</span></span></span>

参见最后的效果图,这里每一个列表项有两幅图,一行文字,图片和文字都是用 qvariant_cast<QPixmap>(index.data(Qt::UserRole+1)); index.data(Qt::UserRole).toString(); 取得的,注意qvariant_cast的用法。

index.data(Qt::UserRole+1) 会调用model中的 QVariant data ( const QModelIndex & index, int role ) const 方法。 delegate 的role和 model 的role对应。 通过修改model中data的实现,可以使得delegate显示不同的东西,而delegate的代码不需变动,实现了数据的隔离。到目前为止一个只读的自定义列表就完成了,在paint方法中加入下面的代码,可以画出一个pushButton, 但是点击没有反应,这需要在下面的编辑功能中实现。

<span style="font-size:14px;">        </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionbutton.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionButton</span></span></a><span style="font-size:14px;"> opt</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>        opt.<span class="me1"><span style="color:#2b74c7;">state</span></span> <span class="sy0"><span style="color:#006e28;">|=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyle.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyle</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">State_Enabled</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>        opt.<span class="me1"><span style="color:#2b74c7;">rect</span></span> <span class="sy0"><span style="color:#006e28;">=</span></span> option.<span class="me1"><span style="color:#2b74c7;">rect</span></span>.<span class="me1"><span style="color:#2b74c7;">adjusted</span></span><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">1</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> <span class="nu0"><span style="color:#b08000;">1</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> <span class="sy0"><span style="color:#006e28;">-</span></span><span class="nu0"><span style="color:#b08000;">10</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> <span class="sy0"><span style="color:#006e28;">-</span></span><span class="nu0"><span style="color:#b08000;">10</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>        opt.<span class="me1"><span style="color:#2b74c7;">text</span></span> <span class="sy0"><span style="color:#006e28;">=</span></span> trUtf8<span class="br0"><span style="color:#006e28;">(</span></span><span class="st0"><span style="color:#bf0303;">"Button text"</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>        </span><a target=_blank href="http://doc.trolltech.com/latest/qapplication.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QApplication</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">style</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">-></span></span><span class="me3"><span style="color:#2b74c7;">drawControl</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qstyle.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyle</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">CE_PushButton</span></span><span class="sy0"><span style="color:#006e28;">,</span></span> <span class="sy0"><span style="color:#006e28;">&</span></span>opt<span class="sy0"><span style="color:#006e28;">,</span></span> painter<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="nu0"><span style="color:#b08000;">0</span></span><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span></span></span>
item中显示不同的字体

这里是painter的使用技巧,要在同一个列表项中的显示的不同的字体,需要在新的的 painter->save,painter->restore段中写, 如下的代码段实现了最后的效果图

<span style="font-size:14px;"><span class="kw4"><span style="color:#0057ae;">void</span></span> MyDelegate<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">paint</span></span> <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qpainter.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPainter</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> painter<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> opt<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">save</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">// get the data and the rectangles   </span>
</span>    <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstring.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QString</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">&</span></span> text <span class="sy0"><span style="color:#006e28;">=</span></span> index.<span class="me1"><span style="color:#2b74c7;">data</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="br0"><span style="color:#006e28;">)</span></span>.<span class="me1"><span style="color:#2b74c7;">toString</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"> displayRect<span class="sy0"><span style="color:#006e28;">;</span></span></span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//set the paint rect</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">setPen</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qcolor.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QColor</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">255</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">127</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">127</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">drawText</span></span><span class="br0"><span style="color:#006e28;">(</span></span>displayRect<span class="sy0"><span style="color:#006e28;">,</span></span> text</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">restore</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span> 
    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">save</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">// get the data and the rectangles   </span>
</span>    <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstring.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QString</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">&</span></span> text2 <span class="sy0"><span style="color:#006e28;">=</span></span> index.<span class="me1"><span style="color:#2b74c7;">data</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="sy0"><span style="color:#006e28;">+</span></span><span class="nu0"><span style="color:#b08000;">1</span></span><span class="br0"><span style="color:#006e28;">)</span></span>.<span class="me1"><span style="color:#2b74c7;">toString</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"> displayRect2<span class="sy0"><span style="color:#006e28;">;</span></span></span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//set the paint rect</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">setPen</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qcolor.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QColor</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">255</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">122</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">0</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">drawText</span></span><span class="br0"><span style="color:#006e28;">(</span></span>displayRect2<span class="sy0"><span style="color:#006e28;">,</span></span> text2</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    painter<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">restore</span></span></span><span style="color:#006e28;"><span style="font-size:14px;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
<span class="br0">}</span></span></span>

增加编辑功能

可编辑的model

要使model可以修改data,我们需要重写flags,setData , 修改后的model变成:

<span style="font-size:14px;"><span class="kw2"><span style="color:#0057ae;">class</span></span> parserModel <span class="sy0"><span style="color:#006e28;">:</span></span> <span class="kw2"><span style="color:#0057ae;">public</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qabstractlistmodel.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QAbstractListModel</span></span></a>
<span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw2">Q_OBJECT</span>
<span class="kw2">public</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">:</span>
</span>    parserModel<span class="br0"><span style="color:#006e28;">(</span></span><span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstringlist.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStringList</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>strings<span class="sy0"><span style="color:#006e28;">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qobject.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QObject</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span>parent <span class="sy0"><span style="color:#006e28;">=</span></span> <span class="nu0"><span style="color:#b08000;">0</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//basic function for a read-only model</span>
</span>    <span class="kw4"><span style="color:#0057ae;">int</span></span> rowCount <span class="br0"><span style="color:#006e28;">(</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> parent <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span></span> <span class="br0"><span style="color:#006e28;">)</span></span> const</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qvariant.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QVariant</span></span></a><span style="font-size:14px;"> data <span class="br0"><span style="color:#006e28;">(</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">int</span></span> role <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">DisplayRole</span></span> <span class="br0"><span style="color:#006e28;">)</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//for a editable model</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">ItemFlags</span></span> flags<span class="br0"><span style="color:#006e28;">(</span></span><span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>index<span class="br0"><span style="color:#006e28;">)</span></span> const</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    <span class="kw4"><span style="color:#0057ae;">bool</span></span> setData<span class="br0"><span style="color:#006e28;">(</span></span><span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>index<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qvariant.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QVariant</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>value<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">int</span></span> role</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
<span class="kw2"><span style="color:#0057ae;">private</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">:</span>
</span>    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//simple data source just a QStringList, if need can add other list of QString, int, bool, struct or class</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qstringlist.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStringList</span></span></a><span style="font-size:14px;"> stringList</span><span style="color:#006e28;"><span style="font-size:14px;"><span class="sy0">;</span>
<span class="br0">}</span><span class="sy0">;</span></span></span>

其中 flags方法非常重要,需要根据具体的user case 来设定,这个例子处理的简单草率。 来看setData

<span style="font-size:14px;"><span class="kw4"><span style="color:#0057ae;">bool</span></span> parserModel<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">setData</span></span><span class="br0"><span style="color:#006e28;">(</span></span><span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>index</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">,</span>
</span>                              <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qvariant.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QVariant</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span>value<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">int</span></span> role</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span>
<span class="br0">{</span>
</span>    <span class="kw1"><strong>if</strong></span> <span class="br0"><span style="color:#006e28;">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">isValid</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span></span> <span class="sy0"><span style="color:#006e28;">&&</span></span> role <span class="sy0"><span style="color:#006e28;">==</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">EditRole</span></span><span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span> 
        stringList.<span class="me1"><span style="color:#2b74c7;">replace</span></span><span class="br0"><span style="color:#006e28;">(</span></span>index.<span class="me1"><span style="color:#2b74c7;">row</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">,</span></span> value.<span class="me1"><span style="color:#2b74c7;">toString</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>        emit dataChanged<span class="br0"><span style="color:#006e28;">(</span></span>index<span class="sy0"><span style="color:#006e28;">,</span></span> index</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>        <span class="kw1"><strong>return</strong></span> true</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">}</span>
</span>    <span class="kw1"><strong>return</strong></span> false</span><span style="color:#006e28;"><span style="font-size:14px;"><span class="sy0">;</span>
<span class="br0">}</span></span></span>

由于我们使用的是简单的QListView, 要使用标准的Qt::EditRole来传递编辑数据。数据修改结束发射signal 提示listview 改变显示。 emit dataChanged(index, index);

可编辑的delegate

要使delegate可以修改data,我们需要重写createEditor ,setEditorData ,setModelData ,updateEditorGeometry , 修改后的delegate变成:

<span style="font-size:14px;"><span class="kw2"><span style="color:#0057ae;">class</span></span> MyDelegate <span class="sy0"><span style="color:#006e28;">:</span></span> <span class="kw2"><span style="color:#0057ae;">public</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qitemdelegate.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QItemDelegate</span></span></a>
<span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw2">Q_OBJECT</span>
<span class="kw2">public</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">:</span>
</span>    <span class="kw2"><span style="color:#0057ae;">explicit</span></span> MyDelegate<span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qobject.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QObject</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span>parent <span class="sy0"><span style="color:#006e28;">=</span></span> <span class="nu0"><span style="color:#b08000;">0</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//basic function for a read-only delegate, you can draw anything with the painter</span>
</span>    <span class="kw4"><span style="color:#0057ae;">void</span></span> paint <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qpainter.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPainter</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> painter<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> const</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qsize.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QSize</span></span></a><span style="font-size:14px;"> sizeHint <span class="br0"><span style="color:#006e28;">(</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> const</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span> 
    </span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//for a editable delegate</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> createEditor <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> parent<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    <span class="kw4"><span style="color:#0057ae;">void</span></span> setEditorData <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> editor<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    <span class="kw4"><span style="color:#0057ae;">void</span></span> setModelData <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> editor<span class="sy0"><span style="color:#006e28;">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qabstractitemmodel.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QAbstractItemModel</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> model<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span>  </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    <span class="kw4"><span style="color:#0057ae;">void</span></span> updateEditorGeometry <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> editor<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><span style="color:#006e28;"><span style="font-size:14px;"><span class="sy0">;</span>
<span class="br0">}</span><span class="sy0">;</span></span></span>

由于我们这里的数据只是QString, 于是用了个QLineEdit,如果还有其他数据需要编辑,可以做一个widget,在里面加入 QLineEdit ,QSpinBox,checkbox等editor,或自定义的editor如StarDelegate。然后在setModelData 中响应。

<a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> MyDelegate<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">createEditor</span></span> <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> parent<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qlineedit.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QLineEdit</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span>editor <span class="sy0"><span style="color:#006e28;">=</span></span> <span class="kw1"><strong>new</strong></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qlineedit.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QLineEdit</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span>parent</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">;</span>
</span>    <span class="kw1"><strong>return</strong></span> editor</span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
<span class="br0">}</span>
</span><span class="kw4"><span style="color:#0057ae;">void</span></span> MyDelegate<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">setModelData</span></span> <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> editor<span class="sy0"><span style="color:#006e28;">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qabstractitemmodel.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QAbstractItemModel</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> model<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qlineedit.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QLineEdit</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span>textEdit <span class="sy0"><span style="color:#006e28;">=</span></span> qobject_cast<span class="sy0"><span style="color:#006e28;"><</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qlineedit.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QLineEdit</span></span></a><span style="font-size:14px;"> <span style="color:#006e28;"><span class="sy0">*></span><span class="br0">(</span></span>editor<span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    model<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">setData</span></span><span class="br0"><span style="color:#006e28;">(</span></span>index<span class="sy0"><span style="color:#006e28;">,</span></span> qVariantFromValue<span class="br0"><span style="color:#006e28;">(</span></span>textEdit<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">text</span></span></span><span style="color:#006e28;"><span style="font-size:14px;"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
<span class="br0">}</span></span></span>

setEditorData需要读取Model数据

<span style="font-size:14px;"><span class="kw4"><span style="color:#0057ae;">void</span></span> MyDelegate<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">setEditorData</span></span> <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> editor<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span>    <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstring.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QString</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">&</span></span> text <span class="sy0"><span style="color:#006e28;">=</span></span> index.<span class="me1"><span style="color:#2b74c7;">data</span></span><span class="br0"><span style="color:#006e28;">(</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qt.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">Qt</span></span></a><span style="font-size:14px;"><span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">UserRole</span></span><span class="br0"><span style="color:#006e28;">)</span></span>.<span class="me1"><span style="color:#2b74c7;">toString</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qlineedit.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QLineEdit</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span>textEdit <span class="sy0"><span style="color:#006e28;">=</span></span> qobject_cast<span class="sy0"><span style="color:#006e28;"><</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qlineedit.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QLineEdit</span></span></a><span style="font-size:14px;"> <span style="color:#006e28;"><span class="sy0">*></span><span class="br0">(</span></span>editor<span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="font-size:14px;"><span style="color:#006e28;"><span class="sy0">;</span>
</span>    textEdit<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">setText</span></span><span class="br0"><span style="color:#006e28;">(</span></span>text</span><span style="color:#006e28;"><span style="font-size:14px;"><span class="br0">)</span><span class="sy0">;</span>
<span class="br0">}</span></span></span>

列表的元素被选中进入编辑状态后,描绘就不通过paint了,这个时候要重做一遍,好在只需做一次特殊处理,用updateEditorGeometry

<span style="font-size:14px;"><span class="kw4"><span style="color:#0057ae;">void</span></span> MyDelegate<span class="sy0"><span style="color:#006e28;">::</span></span><span class="me2"><span style="color:#2b74c7;">updateEditorGeometry</span></span> <span class="br0"><span style="color:#006e28;">(</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qwidget.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QWidget</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">*</span></span> editor<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qstyleoptionviewitem.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QStyleOptionViewItem</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> option<span class="sy0"><span style="color:#006e28;">,</span></span> <span class="kw4"><span style="color:#0057ae;">const</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qmodelindex.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QModelIndex</span></span></a><span style="font-size:14px;"> <span class="sy0"><span style="color:#006e28;">&</span></span> index <span class="br0"><span style="color:#006e28;">)</span></span> </span><span style="color:#0057ae;"><span style="font-size:14px;"><span class="kw4">const</span>
</span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">{</span>
</span> 
    </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"> decorationRect <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span>option.<span class="me1"><span style="color:#2b74c7;">rect</span></span>.<span class="me1"><span style="color:#2b74c7;">topLeft</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">,</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qsize.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QSize</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">80</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">80</span></span></span><span style="font-size:14px;"><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
</span>    </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"> displayRect <span class="sy0"><span style="color:#006e28;">=</span></span> </span><a target=_blank href="http://doc.trolltech.com/latest/qrect.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QRect</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span>decorationRect.<span class="me1"><span style="color:#2b74c7;">topRight</span></span><span style="color:#006e28;"><span class="br0">(</span><span class="br0">)</span><span class="sy0">+</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qpoint.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QPoint</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">20</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">30</span></span><span style="color:#006e28;"><span class="br0">)</span><span class="sy0">,</span></span></span><a target=_blank href="http://doc.trolltech.com/latest/qsize.html"><span class="kw5"><span style="font-size:14px;color:#22aadd;">QSize</span></span></a><span style="font-size:14px;"><span class="br0"><span style="color:#006e28;">(</span></span><span class="nu0"><span style="color:#b08000;">150</span></span><span class="sy0"><span style="color:#006e28;">,</span></span><span class="nu0"><span style="color:#b08000;">25</span></span><span style="color:#006e28;"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></span></span><span style="font-size:14px;"><span style="color:#888888;"><span class="co1">//QRect(decorationRect.topRight()+QPoint(20,30),QSize(50,50));</span>
</span>    editor<span class="sy0"><span style="color:#006e28;">-></span></span><span class="me3"><span style="color:#2b74c7;">setGeometry</span></span><span class="br0"><span style="color:#006e28;">(</span></span>displayRect</span><span style="color:#006e28;"><span style="font-size:14px;"><span class="br0">)</span><span class="sy0">;</span>
<span class="br0">}</span></span></span>

至此一个可编辑的自定义listview就做出来了, 通过修改字符串指向已存在的图像的路径,可以改变列表中的图片。 限于篇幅自定义的按钮留待以后实现。

使用StyleSheet定制listview的外观

 

未来的工作

selection 在这里没有讨论, 卷动listview时候的动画效果没有讨论,自定义的按钮可以通过在model中增加状态数据,在delegate增加事件,在view中增加事件过滤来支持,以后讨论

屏幕截图

CustomListview1.PNG
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值