Qt树形结构的拖拽

记录下最近处理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 );

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt TreeTable 是一种可以展示树形数据的表格控件,它以树的形式展示数据,并且支持自定义。 首先,我们需要创建一个 QTreeWidget 控件作为 TreeTable 的容器,然后使用 setColumnCount() 方法设置表格的列数,使用 setHeaderLabels() 方法设置表头的标签。接下来,我们可以使用 QTreeWidgetItem 类来创建树节点,使用 addTopLevelItem() 方法将节点添加到 TreeTable 中。使用 addChild() 方法可以创建子节点,使用 setText() 方法设置节点的文本内容。 为了实现自定义功能,可以使用 QTreeWidgetItem 的 setFlags() 方法设置节点的标志。例如,使用 Qt.ItemIsEditable 标志可以让节点可编辑,使用 Qt.ItemIsSelectable 标志可以让节点可选中。 此外,Qt 的信号与槽机制可以用来处理 TreeTable 中的事件。我们可以使用 itemClicked() 信号来处理节点点击事件,使用 itemChanged() 信号来处理节点内容改变事件。 为了更好地显示树形结构,可以使用 setIndentation() 方法设置节点之间的缩进宽度。还可以使用 setFirstItemColumnSpanned() 方法设置是否将第一列的单元格合并成一个单元格。 总之,Qt TreeTable 提供了丰富的功能和自定义选项,可以让我们灵活地展示和操作树形数据。 ### 回答2: Qt的TreeTable是一种在QTreeView和QAbstractTableModel的基础上自定义的树形表格控件。它允许我们以树的形式显示数据,同时保留表格的布局。 首先,我们可以继承QAbstractTableModel来自定义我们的模型。在模型中,我们需要实现一些关键的函数,比如rowCount()、columnCount()、data()和headerData()等。这些函数负责提供模型所需的数据。 然后,我们可以使用QTreeView来显示树形结构。通过设置树形表格的模型为我们自定义的模型,即可将数据以树的形式显示出来。 除了基本的显示外,我们还可以对树形表格进行一些自定义的操作。例如,通过重写QAbstractItemModel的flags()函数来设置每个项的标志。我们可以根据实际需求设置是否允许编辑、是否可选中等。 另外,我们可以为树形表格添加一些自定义的功能,比如展开和折叠节点、添加和删除节点等。通过响应合适的信号和槽函数,我们可以实现这些功能。 总之,Qt的TreeTable是一种强大的树形表格控件,可以满足我们开发中对树形结构展示和编辑的需求。通过继承QAbstractTableModel和QTreeView,结合自定义的功能和操作,我们可以灵活地定制出符合自己需求的树形表格控件。 ### 回答3: Qt的TreeTable是一种用于展示树型结构数据的表格控件,并且它支持自定义功能。在使用Qt的TreeTable控件时,我们可以通过自定义来实现一些特殊的功能。 首先,通过继承QAbstractItemModel类,我们可以实现自定义的树形结构数据模型。通过重写QAbstractItemModel类的一些方法,我们可以自定义节点的层次关系、节点数据的获取与更新,并且支持自定义节点样式。 其次,可以自定义树形表格的视图类,继承自QTableView类。通过重写视图类的一些方法,我们可以实现自定义的表格样式和展示效果。例如,可以设置不同的节点展开或折叠图标,并对表格的列进行自定义排序。 另外,Qt还提供了QStyledItemDelegate类,可以通过继承该类,自定义每个单元格的显示样式。通过重写QStyledItemDelegate类的paint()方法,我们可以自定义单元格的绘制方式,包括背景色、字体、图标等。 最后,Qt还提供了信号与槽机制,可以通过自定义的槽函数来实现一些特殊的功能需求。例如,可以通过监测节点的展开与折叠信号,来动态加载子节点数据,实现懒加载的效果。 总之,Qt的TreeTable控件支持自定义的功能非常丰富,通过自定义数据模型、视图以及节点样式,以及利用信号与槽机制,我们可以实现各种各样的树形表格需求,并提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值