子类化QListWidget实现自定义拖拽功能.

2023-11-01

我们经常会碰到这样的一个问题,我们想把其他地方选中的文本,直接通过拖拽移动到一个控件中,从而实现方便添加项的功能.
这里我们以QListWidget作为例子,来实现这么一个功能:其他地方的文本可直接拖拽进QListWidget中,且QListWidget部件中的文本可相互拖拽,也就是可以从QListWidget中拖拽项到另外一个QListWidget中,实现拖拽项的功能.

首先我们对QListWidget进行子类化的操作,也就是定义一个继承QListWidget的类.

//"QMyListWidget.h"
#ifndef QMYLISTWIDGET_H
#define QMYLISTWIDGET_H

#include <QtGui>
#include <QListWidget>
#include <QApplication>

class QMyListWidget : public QListWidget
{
    Q_OBJECT

public:
    QMyListWidget(QWidget *parent);
    ~QMyListWidget();
protected:
    //重写下面两个函数来完成从该部件中拖拽出去的操作.
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    //重写下面三个函数来完成接受外来拖拽的操作.
    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dropEvent(QDropEvent *event);
private:
    //记录拖拽的起点.
    QPoint m_dragPoint;
    //记录被拖拽的项.
    QListWidgetItem *m_dragItem;
};

#endif // QMYLISTWIDGET_H

接下来我们只要重写这五个函数即可.

//"QMyListWidget.cpp"
#include "QMyListWidget.h"

QMyListWidget::QMyListWidget(QWidget *parent)
    : QListWidget(parent)
{
    //设置QListWidget接受拖拽.
    this->setAcceptDrops(true);
}

QMyListWidget::~QMyListWidget()
{

}
//重写鼠标点击操作.
void QMyListWidget::mousePressEvent(QMouseEvent *event)
{
    //确保左键拖拽.
    if (event->button() == Qt::LeftButton)
    {
        //先保存拖拽的起点.
        m_dragPoint = event->pos();
        //保留被拖拽的项.
        m_dragItem = this->itemAt(event->pos());
    }
    //保留原QListWidget部件的鼠标点击操作.
    QListWidget::mousePressEvent(event);
}

void QMyListWidget::mouseMoveEvent(QMouseEvent *event)
{
    //确保按住左键移动.
    if (event->buttons() & Qt::LeftButton)
    {
        QPoint temp = event->pos() - m_dragPoint;
        //只有这个长度大于默认的距离,才会被系统认为是形成拖拽的操作.
        if (temp.manhattanLength() > QApplication::startDragDistance())
        {
            QDrag *drag = new QDrag(this);
            QMimeData *mimeData = new QMimeData;
            mimeData->setText(m_dragItem->text());
            drag->setMimeData(mimeData);
            auto action = drag->exec(Qt::CopyAction | Qt::MoveAction);

            if (action == (Qt::CopyAction) || (action == Qt::MoveAction))
            {
                //当成功拖拽后,删除拖拽项.
                auto i = this->takeItem(this->row(m_dragItem));
                delete i;
            }
        }
    }
    QListWidget::mouseMoveEvent(event);
}

void QMyListWidget::dragEnterEvent(QDragEnterEvent *event)
{
    //设置动作为移动动作.
    event->setDropAction(Qt::MoveAction);
    //然后接受事件.这个一定要写.
    event->accept();
}
void QMyListWidget::dragMoveEvent(QDragMoveEvent *event)
{
    event->setDropAction(Qt::MoveAction);
    event->accept();
}
//当拖拽项被放下时的操作.
void QMyListWidget::dropEvent(QDropEvent *event)
{
    QString str = event->mimeData()->text();
    if (!str.isEmpty())
    {
        //找到当前鼠标位置在部件中的项.
        auto item = this->itemAt(event->pos());
        //
        if (!item)
            this->addItem(str);
        else
            this->insertItem(this->row(item),str);

        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}

这样我们就实现了自定义的QListWidget,接下来我们在Qt设计师中,拖拽出两个QListWidget部件.
我们右键点击QListWidget,点击第二个提升为,因为我之前已经提升过了,然后在取消提升,所以就有了提升的记录选项,你们是没有的.
这里写图片描述

然后输入自定义的类.点击添加,然后点击提升就好了,两个QListWidget都要提升喔.
这里写图片描述

下面是”c.cpp”下的代码:

#include "c.h"

c::c(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    ui.listWidget->addItems(QStringList()<<"zz"<<"xx"<<"cc");
}

c::~c()
{

}

c.h和main.cpp的代码:

#ifndef C_H
#define C_H

#include <QtWidgets/QWidget>
#include "ui_c.h"

class c : public QWidget
{
    Q_OBJECT

public:
    c(QWidget *parent = 0);
    ~c();

private:
    Ui::cClass ui;
};

#endif // C_H

//main.cpp
#include "c.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    c w;
    w.show();
    return a.exec();
}

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子类化QListWidget实现自定义拖拽功能. 的相关文章

  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • 如何向同一个 QMenu 添加多个 QAction?

    我正在尝试实现 Qt 菜单自定义 并且我提供了一个功能来添加相同的功能QAction在同一个人民币上下文菜单中多次 但是当我尝试这样做时 myMenu gt addAction myAction myMenu gt addAction my
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • 扩展 TabViewStyle styleData

    我目前正在尝试找到一种更好的方法来执行此操作 将图标添加到选项卡 现在 我正在放弃 styleData title 以包含图标源 但如果能够扩展 styleData 就更好了 这样我就可以包含其他自定义属性 这是我当前的黑客 Tab tit
  • 如何在 Qt simple 上解密/加密某些字符串(例如密码)

    这是我得到的 Qt SDK版本4 6 2 视窗XP 问题 我怎样才能简单地加密和简单地加密QString价值 我需要它能够将一些加密的字符串保存到 INI 文件中 并在重新打开应用程序后将字符串加密为正常的密码字符串值 PS 我正在寻找简单
  • QChart 对大数据集无响应

    我的这段代码适用于高达 1000 的数据大小 现在我用 65536 个点对其进行了测试 series new QLineSeries QList
  • 如何在 Qt-Creator 中添加自定义构建步骤?

    构建我的应用程序后 我想将其复制到特定目录 在 Windows 7 上 自定义构建步骤 cmd exe c k copy MyPlugin dll HostApp Debug plugins 但我有错误 Can t run process
  • QML改变图像颜色

    我搜索了如何对图像进行着色 格式为 svg 或 png 我尝试用一 个填充图像的矩形覆盖我的图像 但由于我的图像不是矩形 它会给整个矩形着色 而不仅仅是图像 可以用qml改变图像颜色吗 或者 是否可以使用 QPixmap 更改 qt 使用
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 如何在不同的QT线程中创建一个窗口?

    我有一个应用程序 其中每个线程 主线程除外 都需要创建自己的窗口 我尝试创建一个线程然后调用this gt exec in the run功能 然而 在我接到那个电话之前我就收到了一个错误 ASSERT failure in QWidget
  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • 在信号/槽处理期间删除 QObject

    我知道从槽处理中删除 QObject 可能会使应用程序崩溃 因为它可能有其他排队的事件 因此 我将使用 obj gt deleteLater 而不是使用 delete obj 据我所知 obj 等待处理所有排队的事件 然后 删除 obj Q
  • MapItemView 在 dataChanged 信号后不会更新

    我正在使用 QMLMapItemView使用 C 的组件QAbstractListModel基于模型 这MapItemView当模型重置时 或者每当添加新项目或删除现有项目时 工作正常 但是 那MapItemView不反映对已添加项目的更改
  • Qt 和 MOC 的困境与简单的制作

    我想这更像是一个 GNU Make 问题 而不是 Qt 和 moc 但这里是 我有一个包含多个目录Q OBJECTS 我有一些简单的代码 它收集所有这些 例如 MOCS shell grep l Q OBJECT HEADERS Assum
  • 如何通过信号和槽传递参数?

    我的 GUI 包括LineEdit and a 按钮 当 的时候按钮单击后 插槽clicked 叫做 我想在之间建立信号槽关系clicked 作为信号和doSomething 作为插槽 问题是doSomething 无权访问 UI 并且do
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点

随机推荐

  • 让你真正明白cinder与swift、glance的区别

    http www aboutyun com thread 10060 1 1 html 问题导读 1 你认为cinder与swift区别是什么 2 cinder是否存在单点故障 3 cinder是如何发展而来的 在openstack中 我们
  • 计算机辅助绘图考试题,计算机辅助设计绘图考试题(A)(大学期末复习试题).doc...

    教师试做时间出题教师 取题时间审核教研室主任出题单位使用班级考试日期院 部 主任考试成绩期望值印刷份数规定完成时间交教务科印刷日期 学号 姓名 班级 密 封 线 专业 年级 班 学年 第 学期 计算机辅助设计绘图 A 课试卷 题号一二三四五
  • Swagger 的简介和使用

    文章目录 Swagger 的简介和使用 什么是Swagger 简介 Swagger页面 Swagger快速上手 pom xml文件中引入依赖 构建Swagger配置类 Swagger使用 常用注解说明 注解的使用 总结 Swagger 的简
  • Spark jar包加载顺序及冲突解决

    一 spark jar包加载顺序 1 SystemClasspath Spark安装时候提供的依赖包 通常是spark home目录下的jars文件夹 SystemClassPath 2 Spark submit jars 提交的依赖包 U
  • Java-Map集合

    基本使用 public class Demomap public static void main String args Map
  • 关于VMware workstation Player的虚拟网络编辑器没有的情况

    VMware workstation Player 是没有 虚拟网络编辑器的 如果要按照韦东山老师的方法去配置NAT网络 可以再下载VMware workstation pro 尽管不在试用期 依然会给你虚拟网络编辑器的应用安装
  • 光照 (5) 光照贴图

    物体在不同的部件上都有不同的材质属性 1 1 漫反射 允许我们对物体的漫反射分量 以及间接地对环境光分量 它们几乎总是一样的 和镜面光分量有着更精确的控制 漫反射贴图 Diffuse Map 使用一张覆盖物体的图像 让我们能够逐片段索引其独
  • 十大排序算法:快速排序算法

    一 快速排序算法思想或步骤 分解 数组A p r 被划分为两个子数组A p q 1 和A q 1 r 使得A q 为大小居中的数 左侧A p q 1 中的每个元素都小于等于它 而右边A q 1 r 每个元素都大于等于它 解决 通过递归调用快
  • linux shell oracle脚本_分享一个shell脚本--统计Oracle最消耗资源的SQL语句

    概述 This project meant to provide useful scripts for DB maintance and management to make work easier and interesting 今天主要
  • Unity Shader Graphs无法代码动态赋值的问题解决

    起因 给一个材质球更换图片 动态更换了很久 换不上去 解决 Reference unity给的是随机的名字只需要改成自己的名字就可以了 完美解决 不需要下划线 只是自己定义的名字 box EndTarget image material S
  • sqli-labs通关攻略教程六(less26~less28a)

    文章目录 less 26 方法1 方法2 补充知识 less 26a less 27 less 27a less 28 less 28a less 26 方法1 由题目可知 本题绕过了空格和注释 注释符用 1 1或者 00绕过 空白符绕过
  • android intent深入解析

    一 Intent的显示调用 1 intent setClass this OtherActivity class 2 intent setClassName this com zizhu activitys OtherActivity 3
  • Linux chown命令

    Linux Unix 是多人多工操作系统 所有的文件皆有拥有者 利用 chown 将指定文件的拥有者改为指定的用户或组 用户可以是用户名或者用户ID 组可以是组名或者组ID 文件是以空格分开的要改变权限的文件列表 支持通配符 一般来说 这个
  • java解决Exception in thread “main“ java.lang.OutOfMemoryError: GC overhead limit exceeded

    这个就是内存占用超过了限制 解决方案 加载文件的容量太大 这个只能切分文件 使用BufferedInputStream一行行读取 BufferedInputStream bufferedReader new BufferedInputStr
  • 输入三角形的3个边长,a,b,c求出三角形的面积。(C语言)

    代码 define CRT SECURE NO WARNINGS 1 include
  • requestBody注解转化json报错

    RequestBody ResponseBody 注解详解 转 解决方法 不要用modelMap 新建一个hashMap类即可 进来给app写接口比较多 遇到一个bug requestBody会自动往modelMap里加解决办法 清空map
  • 用redis实现支持优先级的消息队列

    用redis实现支持优先级的消息队列 为什么需要消息队列 系统中引入消息队列机制是对系统一个非常大的改善 例如一个web系统中 用户做了某项操作后需要发送邮件通知到用户邮箱中 你可以使用同步方式让用户等待邮件发送完成后反馈给用户 但是这样可
  • 出现 HTTP 错误 500.19 错误代码 0x800700b7

    这个内容出现主要问题是在IIS上 我们一般程序开发 iis中默认的路径只是http localhost 相当于环境变量中已定义好了 如果自己创建的项目直接将路径定义到这 就会替换图二中的路径 然后你的程序图一中所指向的路径就会无效 图三是我
  • Java,Enum里定义属性和方法

    最近的项目用到了大神写的统一返回码的代码 ErrorCode java 统一6位 异常码 author Administrator public enum ErrorCode global OK 000000 操作成功 ERROR 0000
  • 子类化QListWidget实现自定义拖拽功能.

    我们经常会碰到这样的一个问题 我们想把其他地方选中的文本 直接通过拖拽移动到一个控件中 从而实现方便添加项的功能 这里我们以QListWidget作为例子 来实现这么一个功能 其他地方的文本可直接拖拽进QListWidget中 且QList