Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Qt在QTreeWidget之间的拖放

Qt在QTreeWidget之间的拖放
EN

Stack Overflow用户
提问于 2017-11-03 00:18:25
回答 1查看 3.1K关注 0票数 3

在我的QT应用程序中,我有两个QTreeWidget A和B。

我希望为这两种行为重写拖放函数:

  • 从A到A移动所有孩子的物品。
  • 从B到A复制项目与所有儿童。

我认为,在dropEvent函数中,event.source()用于获取源代码。

但是,如何改变国旗的功能,以便于移动或复制?

有一个例子吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-11-04 20:57:20

为了执行此任务,我们必须区分操作是来自自己还是由dropEvent方法覆盖的另一个小部件,这将返回一个类型为QDropEvent的事件,该事件的方法source()返回执行该操作的对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def dropEvent(self, event):
    if event.source() == self:
        # move
    else:
        # copy

  • 从A到A移动所有孩子的物品。

每个QTreeWidgetItem都与其父相关联,因此如果它移动到父级,那么子元素也会移动。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if event.source() == self:
    event.setDropAction(Qt.MoveAction)
    QTreeWidget.dropEvent(self, event)

  • 从B到A复制项目与所有儿童。

这是最复杂的任务,因为当QTreeWidget使用拖放时,它使用mimetype x-qabstractitemmodeldatalist存储与项的QModelIndex关联的行和列的信息,再加上带有角色及其值的字典:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
row_1 | column_1 | number of valid roles | role_1_1 | value_1_1 | ... | role_n_1 | value_n_1 | row_2 | column_2 | ...

因此,了解行和列,不可能获得项,因此也不可能获得您的子项,因为您必须有父项。因此,您应该寻找另一种策略,解决方案是创建一个新的mimetype,其中保存必要的信息以再次获得该项,唯一的方法是保存项目的行,然后保存父项的行,然后保存父类的行,直到到达某个topLevelItem为止。

由于您已经拥有该项,所以可以访问您的子项目及其包含的信息。全面执行情况如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TreeWidget(QTreeWidget):
    customMimeType = "application/x-customTreeWidgetdata"

    def mimeTypes(self):
        mimetypes = QTreeWidget.mimeTypes(self)
        mimetypes.append(TreeWidget.customMimeType)
        return mimetypes

    def startDrag(self, supportedActions):
        drag = QDrag(self)
        mimedata = self.model().mimeData(self.selectedIndexes())

        encoded = QByteArray()
        stream = QDataStream(encoded, QIODevice.WriteOnly)
        self.encodeData(self.selectedItems(), stream)
        mimedata.setData(TreeWidget.customMimeType, encoded)

        drag.setMimeData(mimedata)
        drag.exec_(supportedActions)

    def dropEvent(self, event):
        if event.source() == self:
            event.setDropAction(Qt.MoveAction)
            QTreeWidget.dropEvent(self, event)
        elif isinstance(event.source(), QTreeWidget):
            if event.mimeData().hasFormat(TreeWidget.customMimeType):
                encoded = event.mimeData().data(TreeWidget.customMimeType)
                parent = self.itemAt(event.pos())
                items = self.decodeData(encoded, event.source())
                for it in items:
                    item = QTreeWidgetItem(parent)
                    self.fillItem(it, item)
                    self.fillItems(it, item)
                event.acceptProposedAction()

    def fillItem(self, inItem, outItem):
        for col in range(inItem.columnCount()):
            for key in range(Qt.UserRole):
                role = Qt.ItemDataRole(key)
                outItem.setData(col, role, inItem.data(col, role))

    def fillItems(self, itFrom, itTo):
        for ix in range(itFrom.childCount()):
            it = QTreeWidgetItem(itTo)
            ch = itFrom.child(ix)
            self.fillItem(ch, it)
            self.fillItems(ch, it)

    def encodeData(self, items, stream):
        stream.writeInt32(len(items))
        for item in items:
            p = item
            rows = []
            while p is not None:
                rows.append(self.indexFromItem(p).row())
                p = p.parent()
            stream.writeInt32(len(rows))
            for row in reversed(rows):
                stream.writeInt32(row)
        return stream

    def decodeData(self, encoded, tree):
        items = []
        rows = []
        stream = QDataStream(encoded, QIODevice.ReadOnly)
        while not stream.atEnd():
            nItems = stream.readInt32()
            for i in range(nItems):
                path = stream.readInt32()
                row = []
                for j in range(path):
                    row.append(stream.readInt32())
                rows.append(row)

        for row in rows:
            it = tree.topLevelItem(row[0])
            for ix in row[1:]:
                it = it.child(ix)
            items.append(it)
        return items

在下面的链接中,您将看到一个示例

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47091216

复制
相关文章
Qt QTreeWidget 详解
QTreeWidget详细设置_qtreewidget-C/C++文档类资源-CSDN下载
全栈程序员站长
2022/11/10
1.1K0
Qt QTreeWidget 详解
21.QT-QTreeWidget,QTabWidget
QTreeWidget树形列表 设置标签相关函数 void QTreeWidget::setHeaderItem (QTreeWidgetItem * item ); void QTreeWidget::setHeaderLabel ( constQString & label ); void QTreeWidget::setHeaderLabels ( constQStringList & labels ); 示例: QTreeWidget* tree = new QTreeWidget(); QStr
诺谦
2018/07/31
8600
21.QT-QTreeWidget,QTabWidget
Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]
QT中在QWidget支持拖拽功能,QTreeWidget继承自QWidget,所以自然也具有节点的拖拽功能。
全栈程序员站长
2022/11/14
4.5K0
Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]
HTML5 的拖放(实例:两个div之间拖放图片)
首先,为了使元素(如本图片)可拖动,把 draggable 属性设置为 true :
书童小二
2018/09/03
2.2K0
HTML5 的拖放(实例:两个div之间拖放图片)
Qt官方示例-拖放机器人
  Graphics View提供了QGraphicsScene类,用于管理从QGraphicsItem类派生的大量定制2D图形项目,并与之交互;还提供了QGraphicsView小部件,用于可视化项目,并支持缩放和旋转。
Qt君
2020/02/24
4.8K1
Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
http://www.devbean.net/2013/02/qt-study-road-2-qlistwidget-qtreewidget-qtablewidget/
bear_fish
2018/09/20
3K0
Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
Qt开源作品6-通用视频控件
在之前做的视频监控系统中,根据不同的用户需要,做了好多种视频监控内核,有ffmpeg内核的,有vlc内核的,有mpv内核的,还有海康sdk内核的,为了做成通用的功能,不同内核很方便的切换,比如pro直接改一个DEFINE的变量名,所以需要将各种内核的使用方法做成一样的接口,这样看起来就很整齐,所以后面特意提炼了一个通用的视频控件,该控件没有具体的视频播放控制功能,需要根据不同的内核去调用具体的方法实现,后面还需要增加大华sdk或者其他第三方厂家的协议的时候,直接套用这个通用视频控件即可。
feiyangqingyun
2020/05/11
7490
Qt开源作品6-通用视频控件
QtreeWidget_遍历qtreewidget
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
1K0
QtreeWidget_遍历qtreewidget
qtreewidget基本使用_qtreewidget列宽自适应
1、void QTreeWidget::setHeaderLabels(const QStringList & labels)
全栈程序员站长
2022/11/10
1.9K0
qtreewidget基本使用_qtreewidget列宽自适应
QTreeWidget详解「建议收藏」
  QTreeWidget样式初始化,这里罗列几个基本的配置,包括框架样式、设置头的标题、头的标题是否隐藏、展示的列数:
全栈程序员站长
2022/11/15
3K0
QTreeWidget详解「建议收藏」
17.QT-事件处理分析、事件过滤器、拖放事件
Qt事件处理介绍 Qt平台会将系统产生的消息转换为Qt事件 Qt事件是一个QEvent的对象 Qt事件用来描述程序内部或外部发生的动作 任意的QObject对象都具备事件处理的能力 Qt常见的事件继承
诺谦
2018/05/28
1.5K0
QTreeWidget 简介「建议收藏」
版权声明:如有使用转载,请附加出处 https://blog.csdn.net/jia666666/article/details/81668590
全栈程序员站长
2022/11/15
1.9K0
QTreeWidget 简介「建议收藏」
拖放奥秘
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> *{margin: 0;padding: 0;list-style: none;} #div1{ width: 200px;height: 200px;background: black;position: absolute;left: 50%;top: 50%; margin: -10
贵哥的编程之路
2020/10/28
8430
最新免费Qt视频:Qt 5.9 C++开发指南
今天分享一个B站的C++ Qt视频教程,2021年07月录制的,还是比较新,有需要的朋友可以去看看:Qt 5.9 C++开发指南
沙漠尽头的狼
2022/04/18
8140
python pyqt5 QTreeWidget
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import QIcon, QBrush, QColor from PyQt5.QtCore import Qt
用户5760343
2019/07/23
1K0
python pyqt5 QTreeWidget
Qt Designer基本控件介绍——Item Views(表项视图)和Item Widgets(部件)
两者的关系: Item Views(Model-Based)类内的控件是Item Widgets(Item-Based)内对应控件的父类, 如QTreeWidget是从QTreeView派生的。 ---- 两者的区别: Item Views(Model-Based)的对象进行数据操作相对比较复杂,但处理及展示大数据量时性能高; Item Widgets的数据操作比较简单,但处理及展示大数据量时性能相对低。Item Widgets在开发中没有Item Views灵活,实际上Item Widgets就是在It
Elsa_阿尼
2021/07/09
6.5K0
Qt Designer基本控件介绍——Item Views(表项视图)和Item Widgets(部件)
Qt在mac安装
天天Lotay
2023/10/15
3480
Qt在mac安装
PyQt拖放事件(二)
在PyQt中,重新实现拖放事件处理方法,可用于处理自定义数据,或者实现一些特殊的拖放功能。
用户6021899
2019/08/14
2.8K0
HTML中拖放介绍
1.在jQuery UI里面会经常使用Draggable和Droppable,实现Web开发中拖放效果,当然这不是原生条的拖放,所以在处理复杂的拖放上还是需要自己动手写很多代码,最近开发中就遇到这个问题。拖放的广泛用途:文件管理、数据传输、图标绘制和其他许多操作。个人觉得在列表文件,比如树形菜单上用的比较多。但是这里的拖放和iphone上的触摸(touch)滑动还不完全一样,这里的拖放可能是用鼠标操作,但是触摸滑动主要是通过手指之类的。没有具体开发过mobile web应用,不知道jQuery UI的dra
八哥
2018/01/18
3.1K0
HTML中拖放介绍
点击加载更多

相似问题

多个QTreeWidget之间的数据拖放

10

Qt ->currentText在QTreeWidget中

14

pyside qtreewidget约束拖放

22

QTreeWidget仅在顶层拖放

18

使QTreeWidget项在拖放时展开

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文