QListWidget、QTreeWidget、QTableWidget的拖放

 QListWidget、QTreeWidget、QTableWidget的拖放实验

QAbstractItemView::DragDropMode 的枚举值

QAbstractItemView::NoDragDrop0组件不支持拖放操作
QAbstractItemView::DragOnly1组件只支持拖动操作
QAbstractItemView::DropOnly 2组件只支持放置操作
QAbstractItemView::DragDrop3组件支持拖放操作
QAbstractItemView::InternalMove4组件只支持内部项的移动操作,例如目录树内节点的移动操作

 Qt::DropAction 的枚举值

Qt::CopyAction 1将数据复制到放置点组件处
Qt::MoveAction2将数据从拖动点组件处移动到放置点组件处
Qt::LinkAction 4在拖动点组件和放置点组件之间建立数据连接
Qt::IgnoreAction 0对数据不进行任何操作

效果

DragDropItemExample.h

#ifndef DRAGDROPITEMEXAMPLE_H
#define DRAGDROPITEMEXAMPLE_H

#include <QWidget>
#include <QAbstractItemView>
#include <QGroupBox>
#include <QEvent>


namespace Ui {
class DragDropItemExample;
}

class DragDropItemExample : public QWidget
{
    Q_OBJECT
private:
    //将枚举值 转换为index
    int getDropActionIndex(Qt::DropAction actionType);
    //将index转换为枚举值
    Qt::DropAction getDropActionType(int index);
    //当前设置属性的item widget
    QAbstractItemView * m_ItemView = nullptr;
    //m_ItemView的属性显示到界面上
    void refreshToUI(QGroupBox *curGroupBox);
protected:
    //重写事件过滤器
    bool eventFilter(QObject *watched, QEvent *event);

public:
    explicit DragDropItemExample(QWidget *parent = nullptr);
    ~DragDropItemExample();

private slots:
    void on_radioSource_clicked();

    void on_radioList_clicked();

    void on_radioTree_clicked();

    void on_radioTable_clicked();

    void on_chkAccetDrops_clicked(bool checked);

    void on_chkDragEnabled_clicked(bool checked);

    void on_comboMode_currentIndexChanged(int index);

    void on_comboDefaultAction_currentIndexChanged(int index);

private:
    Ui::DragDropItemExample *ui;
};

#endif // DRAGDROPITEMEXAMPLE_H

DragDropItemExample.cpp

#include "dragdropitemexample.h"
#include "ui_dragdropitemexample.h"

#include <QMessageBox>
#include <QKeyEvent>

int DragDropItemExample::getDropActionIndex(Qt::DropAction actionType)
{
    switch(actionType)
    {
        case Qt::CopyAction:
            return 0;
        case Qt::MoveAction:
            return 1;
        case Qt::LinkAction:
            return 2;
        case Qt::IgnoreAction:
            return 3;
        default:
            return 0;
    }
}

Qt::DropAction DragDropItemExample::getDropActionType(int index)
{
    switch(index)
    {
        case 0:
            return Qt::CopyAction;
        case 1:
            return Qt::MoveAction;
        case 2:
            return Qt::LinkAction;
        case 3:
            return Qt::IgnoreAction;
        default:
            return Qt::CopyAction;
    }
}

void DragDropItemExample::refreshToUI(QGroupBox *curGroupBox)
{
    ui->chkAccetDrops->setChecked(m_ItemView->acceptDrops());
    ui->chkDragEnabled->setChecked(m_ItemView->dragEnabled());
    ui->comboMode->setCurrentIndex((int)m_ItemView->dragDropMode());
    int index = getDropActionIndex(m_ItemView->defaultDropAction());
    ui->comboDefaultAction->setCurrentIndex(index);

    QFont font = ui->groupBox->font();
    font.setBold(false);
    ui->groupBox_source->setFont(font);
    ui->groupBox_list->setFont(font);
    ui->groupBox_tree->setFont(font);
    ui->groupBox_table->setFont(font);
    font.setBold(true);
    curGroupBox->setFont(font);
}

bool DragDropItemExample::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type()!= QEvent::KeyPress)//如果不是按键事件,退出+
        return QWidget::eventFilter(watched,event);

    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
    if(keyEvent->key()!= Qt::Key_Delete)
    {//如果按下的不是delete键 ,退出
        return QWidget::eventFilter(watched,event);
    }

    if(watched == ui->listSource)
    {
        QListWidgetItem *item = ui->listSource->takeItem(ui->listSource->currentRow());
        delete item;//最后释放item
    }
    else if(watched == ui->listWidget)
    {
        QListWidgetItem *item = ui->listWidget->takeItem(ui->listWidget->currentRow());
        delete item;//最后释放item
    }
    else if(watched== ui->treeWidget)
    {
        QTreeWidgetItem *item = ui->treeWidget->currentItem();
        if(item->parent()!=nullptr)
        {
            QTreeWidgetItem *parent =item->parent();
            parent->removeChild(item);
        }
        else
        {//顶级节点的删除takeTopLevelItem(index)
            int index = ui->treeWidget->indexOfTopLevelItem(item);
            ui->treeWidget->takeTopLevelItem(index);
        }
        delete item;//最后释放item
    }
    else if(watched == ui->tableWidget)
    {//删除对应的单元格
        QTableWidgetItem *item =
            ui->tableWidget->takeItem(
            ui->tableWidget->currentRow(),
            ui->tableWidget->currentColumn());
        delete item;
    }
    return true;// eventFilter 返回true表示事件已经处理
}

DragDropItemExample::DragDropItemExample(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::DragDropItemExample)
{
    ui->setupUi(this);

    //evenFilter 需要给控件安装事件过滤器
    ui->listSource->installEventFilter(this);
    ui->listWidget->installEventFilter(this);
    ui->treeWidget->installEventFilter(this);
    ui->tableWidget->installEventFilter(this);

    //设置四个组件的 拖放操作属性
    ui->listSource->setAcceptDrops(true);
    ui->listSource->setDragDropMode(QAbstractItemView::DragDrop);
    ui->listSource->setDragEnabled(true);
    ui->listSource->setDefaultDropAction(Qt::CopyAction);

    ui->listWidget->setAcceptDrops(true);
    ui->listWidget->setDragDropMode(QAbstractItemView::DragDrop);
    ui->listWidget->setDragEnabled(true);
    ui->listWidget->setDefaultDropAction(Qt::CopyAction);

    ui->treeWidget->setAcceptDrops(true);
    ui->treeWidget->setDragDropMode(QAbstractItemView::DragDrop);
    ui->treeWidget->setDragEnabled(true);
    ui->treeWidget->setDefaultDropAction(Qt::CopyAction);

    ui->tableWidget->setAcceptDrops(true);
    ui->tableWidget->setDragDropMode(QAbstractItemView::DragDrop);
    ui->tableWidget->setDragEnabled(true);
    ui->tableWidget->setDefaultDropAction(Qt::CopyAction);

}

DragDropItemExample::~DragDropItemExample()
{
    delete ui;
}

void DragDropItemExample::on_radioSource_clicked()
{
    m_ItemView= ui->listSource;
    refreshToUI(ui->groupBox_source);
}


void DragDropItemExample::on_radioList_clicked()
{
    m_ItemView= ui->listWidget;
    refreshToUI(ui->groupBox_list);
}


void DragDropItemExample::on_radioTree_clicked()
{
    m_ItemView= ui->treeWidget;
    refreshToUI(ui->groupBox_tree);
}


void DragDropItemExample::on_radioTable_clicked()
{
    m_ItemView= ui->tableWidget;
    refreshToUI(ui->groupBox_table);
}


void DragDropItemExample::on_chkAccetDrops_clicked(bool checked)
{
    m_ItemView->setAcceptDrops(checked);
}


void DragDropItemExample::on_chkDragEnabled_clicked(bool checked)
{
    m_ItemView->setDragEnabled(checked);
}


void DragDropItemExample::on_comboMode_currentIndexChanged(int index)
{
    QAbstractItemView::DragDropMode mode=
        (QAbstractItemView::DragDropMode)index;
    //将index强制转换为 dragDropMode
    m_ItemView->setDragDropMode(mode);
    qDebug()<<QString("DragDropMode:%1").arg(index);
}


void DragDropItemExample::on_comboDefaultAction_currentIndexChanged(int index)
{
    Qt::DropAction actionType=getDropActionType(index);
    m_ItemView->setDefaultDropAction(actionType);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/788776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解释 C 语言中的递归函数

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

如何在 C 语言中进行选择排序?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

潜在空间可视化(Latent space visualization)

在“深度学习”系列中&#xff0c;我们不会看到如何使用深度学习来解决端到端的复杂问题&#xff0c;就像我们在《A.I. Odyssey》中所做的那样。我们更愿意看看不同的技术&#xff0c;以及一些示例和应用程序。 1、引言 上次&#xff08;Autoencoders - Deep Learning bits #…

Linux——多线程(五)

1.线程池 1.1初期框架 thread.hpp #include<iostream> #include <string> #include <unistd.h> #include <functional> #include <pthread.h>namespace ThreadModule {using func_t std::function<void()>;class Thread{public:void E…

Python29 Tensorflow的基本知识和使用

1. TensorFlow TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google Brain 团队开发。它用于数据流图的计算&#xff0c;尤其擅长深度学习任务。在 TensorFlow 中&#xff0c;数据流图&#xff08;Data Flow Graph&#xff09;是其核心概念之一&#xff0c;它定义了计算…

Excel第28享:如何新建一个Excel表格

一、背景需求 小姑电话说&#xff1a;要新建一个表格&#xff0c;并实现将几个单元格进行合并的需求。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“XLS工作表”或“XLSX工作表”都可以&#xff0c;如下图所示。 之后&…

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…

Retrofit框架源码深度剖析【Android热门框架分析第二弹】

Android热门框架解析&#xff0c;你确定不来看看吗&#xff1f; OkHttp框架源码深度剖析【Android热门框架分析第一弹】 Retrofit框架源码深度剖析【Android热门框架分析第二弹】 什么是Retrofit&#xff1f; 准确来说&#xff0c;Retrofit 是一个 RESTful 的 HTTP 网络请求…

雷达视频采集卡 HPx-410

产品简介 雷达视频采集卡 HPx-410&#xff0c;应用于接入导航雷达数据&#xff0c;导航雷达视频&#xff0c;适用于JRC雷达、古野furuon雷达、Sperry雷达等多种型号的雷达。 HPx-410 可以接入导航雷达数据&#xff0c;引入导航雷达原始回波&#xff0c;然后将雷达视频采集到计…

centos部署jar包

第一步&#xff1a; 将IDEA中的项目打包为jar,将这个jar文件放到centos服务器上的目录里&#xff0c;我在opt新建api目录&#xff0c;将jar文件放入&#xff0c;如下图&#xff1a; 第二步&#xff1a; 将需要读取的配置文件也放入此目录(其他目录也可以&#xff0c;和脚本中…

Python面试宝典第9题:买卖股票

题目 给定一个整型数组&#xff0c;它的第i个元素是一支给定股票第i天的价格。如果最多只允许完成一笔交易&#xff08;即买入和卖出一支股票一次&#xff09;&#xff0c;设计一个算法来计算你所能获取的最大利润。注意&#xff1a;你不能在买入股票前卖出股票。 示例 1&#…

设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)

写在前面&#xff1a;本文是个人在学习设计模式时的所思所想&#xff0c;汇总了其他博主及自己的感悟思考&#xff0c;可能存在出入&#xff0c;请大家理性食用~~ 工厂模式 在工厂模式中&#xff0c;父类决定实例的生成方式&#xff0c;但并不决定所要生成的具体的类&#xf…

企业应对策略:全面防御.DevicData-P-xxxxxx勒索病毒

引言 在数字化时代&#xff0c;网络安全已成为不可忽视的重要议题。随着互联网的普及&#xff0c;各种网络威胁层出不穷&#xff0c;其中勒索病毒以其独特的攻击方式和巨大的破坏性&#xff0c;给个人用户和企业带来了严重的经济损失和数据安全风险。在众多勒索病毒中&#xff…

前端javascript中的排序算法之选择排序

选择排序&#xff08;Selection Sort&#xff09;基本思想&#xff1a; 是一种原址排序法&#xff1b; 将数组分为两个区间&#xff1a;左侧为已排序区间&#xff0c;右侧为未排序区间。每趟从未排序区间中选择一个值最小的元素&#xff0c;放到已排序区间的末尾&#xff0c;从…

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)

题目描述 一.原本暴力算法 最初的想法是&#xff1a;先比较gas数组和cost数组的大小&#xff0c;找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点&#xff0c;就不能作为起始点)。当找到过后&#xff0c;再去依次顺序跑一圈&#xff0c;如果剩余的油为负数…

11、Python之变量:看得见还是看不见

引言 在前面一篇关于Python变量的文章中&#xff0c;更多地结合对象的内存结构及字节码指令&#xff0c;来看不同代码针对不同的类型的对象的不同效果。 今天这篇文章中&#xff0c;想对新手在使用Python变量中&#xff0c;可能遇到的其他困惑&#xff0c;再展开来说一下。 大…

乐器培训课程报名小程序模板源码

模板介绍 一款实用的音乐课程&#xff0c;乐器培训&#xff0c;艺术类网页课程报名手机小程序模板下载。包含&#xff1a;主页、列表、个人中心、报名等模块。 图片演示 乐器培训课程报名小程序模板源码

《Windows API每日一练》9.13资源-鼠标位图和字符串

鼠标指针位图&#xff08;Mouse Cursor Bitmap&#xff09;是用于表示鼠标指针外观的图像。在 Windows 窗口编程中&#xff0c;可以使用自定义的鼠标指针位图来改变鼠标的外观&#xff0c;并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点&#xff1a; ●…

九、C++11常用新特性—模板的优化

1.模板的右尖括号 在泛型编程种&#xff0c;模板实例化有一个非常繁琐的地方&#xff0c;那就是连续的两个右尖括号&#xff08;>>)会被编译器解析成右移操作&#xff0c;而不是模板参数表的结束&#xff0c;在C11以前需要在>>之间加上一个空格> >。C11之后…

中职网络安全Server2216

任务环境说明&#xff1a;✓ 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09;✓ 用户名:root密码&#xff1a;1234561.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程找出启动异常进程的脚本&#xff0c;并将其绝对路径作为Flag值提交…