這段時間對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