Qt:在TreeModel+QTreeView中使用复选框问题

Thinkvd 开发日志
参考:http://blog.csdn.net/vah101/archive/2011/02/17/6190809.aspx

里面已经说明如何实现,在此就不再重复,反自己遇到的问题说一下:

 

问题1:checkbox后面显示状态数字

问题2:QTreeView中第一行的checkbox状态改变,要Mouse离开才看到响应.

 

问题1看了一个Qt源代码,在void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option,

                                         const QModelIndex &index) const未有:

 value = index.data(Qt::DisplayRole);

        if (value.isValid() && !value.isNull()) {

            v4->features |= QStyleOptionViewItemV2::HasDisplay;

            v4->text = displayText(value, v4->locale);

 

        }

 

也就用在Model中的data函数,让Checkbox的数据为空即可

if(role == Qt::DisplayRole  )

{

............................

rtv = item->data(index.column());

if (key == "_chkbox"){

rtv = QVariant();

.........................

}

 

问题2有点奇怪,可能是自己写的Model或View某个地方有问题,用qt的examples/itemviews/editabletreemodel 测试正常.

解决时刷新了两次才正常:

bool ImListTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)

{

bool result = false;

 

if (role == Qt::EditRole || role == Qt::CheckStateRole )

{

ImListTreeItem *item = getItem(index);

 

if (role==Qt::CheckStateRole && index.column()==0)  

item->setData("_chkbox", value);

emit(dataChanged(index, index));

}

{

result = item->setData(index.column(), value);

if (result) emit dataChanged(index, index);

}

}

 

    return result;

你可能感兴趣的:(测试,qt)