QTableView 切換摺疊展開圖標

    這段時間對MVC的使用和我的理解,發現MVC更側重顯示數據,對於數據的修改之類的操做,實現起來比較繁瑣. 那麼如何在QTableView切換節點摺疊展開的圖標呢 this

 

一. QTreeWidget下的實現3d

      鏈接信號itemExpanded ( QTreeWidgetItem * item ) 和itemCollapsed ( QTreeWidgetItem * item ), 而後操做設置該節點圖標 item->setIcon(); 幾行代碼就搞定了code

 

二. QTableView下的實現blog

   在MVC中修改數據, 必須發射 dataChanged(index,index) 來通知模型更新數據, 也就是必須從新實現 QAbstractItemModel::setData(index,value,role), 在該方法中發現更新信號 get

   1. 鏈接節點摺疊展開信號 it

connect(this,SIGNAL(expanded(const QModelIndex &)),this,SLOT(expand(const QModelIndex &)));
connect(this,SIGNAL(collapsed(const QModelIndex &)),this,SLOT(collapse(const QModelIndex &)));

void TableView::expand(const QModelIndex &index)
{
    pModel->setData(index,true,Qt::DecorationRole);
}

void TableView::collapse(const QModelIndex &index)
{
    pModel->setData(index,false,Qt::DecorationRole);
}

 

   2. 從新實現 QAbstractItemModel::setData(),通知視圖刷新 io

bool TagTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(index.isValid()&&role==Qt::DecorationRole)
    {
        bool pStatus=value.toBool();

	// 設置當前圖標
        TreeItem *item=static_cast<TreeItem*>(index.internalPointer());
        item->setIcon(pStatus);

	// 發射dataChanged(index,index),確保視圖刷新圖標
	emit dataChanged(index,index);
        return true;
    }

    return false;
}

 

   效果以下:ast