记录下最近处理Qt树形结构的过程
由于对于树形机构item的处理较为复杂,因此采用QTreeView来制作树形结构。
对于事件和界面的绘制主要在delegate中完成,由于实现setStyleSheet,所以delegate继承了QStyledItemDelegate。
提一点事件要小心返回值,有时候需要return false 因为后面Qt还有部分针对item选中显示刷新的操作。
做到拖拽时,第一反应是在delegate的editorEvent中完成,但个人觉得delegate是独立的针对单个item
(大部分API传入的参数都有const QModelIndex &index,index与item是一一对应的),因此测试了一下继承QTreeView
,在里面加入drag与drop事件(毕竟往上倒三代也是继承自QWidget)。经测试果然可以响应以下四个事件
void dragEnterEvent( QDragEnterEvent* event );
void dragLeaveEvent( QDragLeaveEvent* event );
void dragMoveEvent( QDragMoveEvent* event );
void dropEvent( QDropEvent* event );其中也出现了些问题
void TreeView::dragEnterEvent( QDragEnterEvent* event )
{
qDebug()<<"dragEnterEvent";
//event->setAccepted(true);不加这一行不管往哪儿拖都是禁止的符号,且 不能接收dropEvent
}
void TreeView::dragMoveEvent( QDragMoveEvent* event )
{
qDebug()<<"dragMoveEvent";
//return QTreeView::dragMoveEvent(event );不加这一行往哪儿拖都是允许(树形结构一般不能向自己子类拖动)。为了这个百度了半天没解决,最后随意尝试了一下居然成功了
}
当然其实你也可以不写
void dragLeaveEvent( QDragLeaveEvent* event );
void dragMoveEvent( QDragMoveEvent* event );