<p>首先,您需要修改TreeItem以跟踪选中的状态:</p>
<pre><code>private:
...
bool checked;
</code></pre>
<p>还有一个二传手和接球手:</p>
<pre><code>bool isChecked() const { return checked; }
void setChecked( bool set ) { checked = set; }
</code></pre>
<p>现在需要修改模型,以便视图了解检查状态:</p>
<pre><code>QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
if ( role == Qt::CheckStateRole && index.column() == 0 )
return static_cast< int >( item->isChecked() ? Qt::Checked : Qt::Unchecked );
if (role != Qt::DisplayRole)
return QVariant();
return item->data(index.column());
}
</code></pre>
<p>并修改模型的flags方法,让视图知道模型包含可检查项:</p>
<pre><code>Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
if ( index.column() == 0 )
flags |= Qt::ItemIsUserCheckable;
return flags;
}
</code></pre>
<p>我想应该这样做。如果希望在用户勾选和取消勾选项时能够更新TreeItem check状态,则需要在TreeModel中提供qabstracttemmodel::setData方法。</p>