QAbstractItemModel+qtreeview

前言

  1. 这里是我比较会详细讲的东西,我觉得学到了挺多知识,通过这一篇基本也可以说是熟练掌握了qt model view的体系。其实这时候也可以想一想mvc或是什么其他的,反正还有个核心思想,数据的处理和前端显示分离,一般来说都通过子线程来处理数据,这样前端页面将十分的丝滑。
  2. 本程序是在描述一个分组、设备、通道的节点关系,他们构成了一个tree。包含关系(父子关系):[分组 [ 设备 [通道 ]]]

功能

  1. 设备、通道可拖动,往操作区域拖动,往分组区域拖动,改变分组。
  2. 统计设备离线在线数量,类似xxxx(1/3)这样显示。
  3. 保存分组信息为json,解析json恢复分组。
  4. 排序
  5. 查找

内容

  1. 重写qtreeview,为什么要重写它,因为当你需要拖动设备去某个分组时,某个分组可能存在于可显示区域的上方或者下方,这时候需要在你拖动到边缘区域时滚动滑动条,显示更多。
    这里我就只贴出关键代码了。
void DeviceTreeView::dragMoveEvent(QDragMoveEvent* event)
{
const QMimeData* pMimeData = event->mimeData();
event->accept();
//qDebug() << "dragMoveEvent" << event->pos() << this->height();
int yPos = event->pos().ry();
int v = verticalScrollBar()->value();
if (yPos <= 30) {
v -= 1;
}
else if (yPos >= (this->height() - 30)) {
v += 1;
}
verticalScrollBar()->setValue(v);
//qDebug() << v;
}

  1. 这里我就把model 和 item一起说了,毕竟我感觉联系听紧密的。
    首先自定义一个item的类,这个item就是为了代表分组、设备、通道等等,他就是一个可具体操作的项。相信你也看了许多网上的相关代码,这个类其实要根据你的数据来定义,一般来说都比较复杂、巨大,所以在item类你可以考虑保存它的key、指针或者什么其他你觉得可以方便间接获取到你数据的方式。