首页 > 其他分享 >Qt实现控件拖曳

Qt实现控件拖曳

时间:2024-12-11 13:59:30浏览次数:3  
标签:控件 Qt setText QTreeWidgetItem 拖曳 new include event QtGuiDrag

DragTreeWidget.h

#ifndef DRAGTREEWIDGET_H
#define DRAGTREEWIDGET_H

#include <QTreeWidget>

class QMouseEvent;

class DragTreeWidget : public QTreeWidget
{
    Q_OBJECT
public:
    DragTreeWidget(QWidget *parent = nullptr);

private:
    void init();

protected:
    virtual void mousePressEvent(QMouseEvent *event) override;
};

#endif // DRAGTREEWIDGET_H

DragTreeWidget.cpp

#include "DragTreeWidget.h"
#include <QMouseEvent>
#include <QMimeData>
#include <QDrag>
#include "QtGuiDrag.h"
#include <QDebug>



DragTreeWidget::DragTreeWidget(QWidget *parent)
    : QTreeWidget(parent)
{
    //初始化数据
    (void)init();

    //设置拖曳模式
    (void)setDragDropMode(QAbstractItemView::InternalMove);

    //使能拖曳
    (void)setDragEnabled(true);
}

void DragTreeWidget::init()
{
    QTreeWidgetItem* topItemSource = new QTreeWidgetItem(this);
    topItemSource->setText(0, QStringLiteral("信号源"));
//    topItemSource->setIcon()
    QTreeWidgetItem* topItemSourceFun1 = new QTreeWidgetItem(topItemSource);
    topItemSourceFun1->setText(0, QStringLiteral("连接设备"));
    QTreeWidgetItem* topItemSourceFun2 = new QTreeWidgetItem(topItemSource);
    topItemSourceFun2->setText(0, QStringLiteral("设置频率"));
    QTreeWidgetItem* topItemSourceFun3 = new QTreeWidgetItem(topItemSource);
    topItemSourceFun3->setText(0, QStringLiteral("设置功率"));
    topItemSource->setExpanded(true);

    QTreeWidgetItem* topItemSpectrum = new QTreeWidgetItem(this);
    topItemSpectrum->setText(0, QStringLiteral("频谱仪"));
    QTreeWidgetItem* topItemSpectrumFun1 = new QTreeWidgetItem(topItemSpectrum);
    topItemSpectrumFun1->setText(0, QStringLiteral("连接设备"));
    QTreeWidgetItem* topItemSpectrumFun2 = new QTreeWidgetItem(topItemSpectrum);
    topItemSpectrumFun2->setText(0, QStringLiteral("设置频率"));
    QTreeWidgetItem* topItemSpectrumFun3 = new QTreeWidgetItem(topItemSpectrum);
    topItemSpectrumFun3->setText(0, QStringLiteral("设置功率"));
    QTreeWidgetItem* topItemSpectrumFun4 = new QTreeWidgetItem(topItemSpectrum);
    topItemSpectrumFun4->setText(0, QStringLiteral("设置衰减"));
    topItemSpectrum->setExpanded(true);

    QTreeWidgetItem* topItemVna = new QTreeWidgetItem(this);
    topItemVna->setText(0, QStringLiteral("矢网"));
    QTreeWidgetItem* topItemVnaFun1 = new QTreeWidgetItem(topItemVna);
    topItemVnaFun1->setText(0, QStringLiteral("连接设备"));
    QTreeWidgetItem* topItemVnaFun2 = new QTreeWidgetItem(topItemVna);
    topItemVnaFun2->setText(0, QStringLiteral("设置频率"));
    QTreeWidgetItem* topItemVnaFun3 = new QTreeWidgetItem(topItemVna);
    topItemVnaFun3->setText(0, QStringLiteral("设置功率"));
    topItemVna->setExpanded(true);
}

void DragTreeWidget::mousePressEvent(QMouseEvent *event)
{

    if(event->button() & Qt::LeftButton)
    {
        qDebug()<<"mousePressEvent 1";

        QTreeWidgetItem *child = static_cast<QTreeWidgetItem*>(itemAt(event->pos()));    //获取当前点击的item对象
        if(!child)
        {
            return;
        }
        QByteArray dataItem;
        QDataStream dataStream(&dataItem, QIODevice::WriteOnly);
        dataStream << child->text(0);
        QMimeData* mimeData = new QMimeData;
        mimeData->setData("Data/name", dataItem);

        QtGuiDrag* dragPixmap = new QtGuiDrag(nullptr);
        dragPixmap->setShowText(child->text(0));
        QPixmap pixmap = dragPixmap->grab();

        QDrag *drag = new QDrag(this);                                  //创建一个拖曳对象并存储相关信息
        drag->setMimeData(mimeData);
        drag->setPixmap(pixmap);
        drag->setHotSpot(QPoint(pixmap.width()/2, pixmap.height()/2));
        qDebug()<<"mousePressEvent 2";
        drag->exec(Qt::MoveAction);
        qDebug()<<"mousePressEvent 3";
    }
    QTreeWidget::mouseMoveEvent(event);
}

DragWidget.h

#ifndef DRAGWIDGET_H
#define DRAGWIDGET_H

#include <QFrame>

class QDragEnterEvent;
class QDropEvent;

class DragWidget : public QFrame
{
public:
    explicit DragWidget(QWidget *parent = nullptr);

protected:
    void dragEnterEvent(QDragEnterEvent *event) override;
    void dropEvent(QDropEvent *event) override;
};

#endif // DRAGWIDGET_H

DragWidget.cpp

#include "DragWidget.h"
#include <QDragEnterEvent>
#include <QMimeData>
#include <QLabel>
#include <QDebug>


DragWidget::DragWidget(QWidget *parent)
    : QFrame(parent)
{
    setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
    setAcceptDrops(true);
}

void DragWidget::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasFormat("Data/name"))
    {
        if (event->source() == this)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        else
        {
            event->acceptProposedAction();
        }
    }
    else
    {
        event->ignore();
    }
}

void DragWidget::dropEvent(QDropEvent *event)
{
    qDebug()<<"dropEvent";
    if (event->mimeData()->hasFormat("Data/name"))
    {
        QByteArray itemData = event->mimeData()->data("Data/name");
        QDataStream dataStream(&itemData, QIODevice::ReadOnly);

        QString txt;
        dataStream >> txt;

        QLabel *newIcon = new QLabel(this);
        newIcon->setText(txt);

        //计算位置
        newIcon->move(event->pos()/* - offset*/);
        newIcon->show();
        newIcon->setAttribute(Qt::WA_DeleteOnClose);

        if (event->source() == this)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        else
        {
            event->acceptProposedAction();
        }
    }
    else
    {
        event->ignore();
    }
}


QtGuiDrag.h

#ifndef QTGUIDRAG_H
#define QTGUIDRAG_H

#include <QWidget>

namespace Ui {
class QtGuiDrag;
}

class QtGuiDrag : public QWidget
{
    Q_OBJECT

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

    void setShowText(const QString& txt);
private:
    Ui::QtGuiDrag *ui;
};

#endif // QTGUIDRAG_H

QtGuiDrag.cpp

#include "QtGuiDrag.h"
#include "ui_QtGuiDrag.h"

QtGuiDrag::QtGuiDrag(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QtGuiDrag)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground, true);
}

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

void QtGuiDrag::setShowText(const QString &txt)
{
    ui->label->setText(txt);
}

标签:控件,Qt,setText,QTreeWidgetItem,拖曳,new,include,event,QtGuiDrag
From: https://www.cnblogs.com/judes/p/18599344

相关文章

  • 源码分析之Openlayers中的控件篇Control基类介绍
    概述Openlayers中内置了9类控件,这9类控件都是基于Control类,而Control类则是继承于BaseObject类,如下图所示:如上,这9类控件分别是:Attribution:属性控件FullScreen:全屏控件MousePosition:鼠标位置控件OverviewMap:鹰眼控件Rotate:旋转控件ScaleLine:比例尺控件Zoom:缩放控件,可......
  • 使用TKinter设计一个有三个文本输入框,三个按钮控件的界面
    下面是使用Tkinter设计一个有三个文本输入框和三个按钮控件的界面的示例代码:importtkinterastkdefon_button1_click():#获取文本输入框1的内容text1=entry1.get()#在控制台打印文本输入框1的内容print("文本输入框1的内容:",text1)defon_but......
  • MQTT协议史上最全解析(纯干货分享)
    目录MQTT是什么?一些术语解释MQTT特点MQTT控制报文格式十四种控制报文1号控制报文:CONNECT–连接到服务端2号控制报文:CONNACK–确认连接请求3号控制报文:PUBLISH–发布消息4号控制报文:PUBACK–发布确认5号控制报文:PUBREC–发布收到(QoS2,第一步)6号控制报文:PU......
  • 入库出库查询软件——qt
    miniMes系统操作说明一:功能说明主界面有扫描--查询两个界面,扫描界面如下1:默认开启自动入库出库功能2:右上角限制位数可根据需求设定二维码字符串的位数,设置完成后点击设定,弹窗设定成功即可3:运行逻辑如下,鼠标点击二维码输入框,扫描二维码,未入库的产品会执行《入库操作》4:两秒......
  • qt激光加工软件开发(一)
    20年毕业后,先是从事qt+c++开发,而后从事mfc开发,今年步入新的公司,着手开发一版新的激光设备加工软件激光加工软件所具备的功能:轴的控制:主要包括XYZ三个轴,品牌:ACS、固高、Galil控制卡等相机控制:用于显示影像,进行识别定位等功能,品牌:大恒、海康、Basler等激光器控制:用于划线,打标,清......
  • 使用ESP32做一个MQTT协议的公网对讲机
    此篇文章在2022年8月14日被记录使用MQTT做一个公网对讲机上一篇博客中,使用ESP32与ESP-NOW协议做了一个短距离对讲机(链接),发布了一个视频在B站评论区中,很多B友希望可以实现无限距离对讲,这样的话需要服务器转发,刚开始我想使用python写一个TCP或者UDP的转发功能,但是考虑到很多小......
  • Linux下Mosquitto MQTT代理的安装与配置指南
    1.引言MQTT(MessageQueuingTelemetryTransport)是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛应用于物联网(IoT)领域。Mosquitto是一个开源的MQTT代理,它支持MQTT协议3.1和3.1.1,适用于各种设备和平台。本文将详细介绍如何在Linux系统下安装和配置MosquittoMQTT代理。......
  • 话说MQTTX工具
    MQTTX是一个强大的跨平台MQTT客户端工具。开发公司EMQ也是非常具有实力的研发公司。以前有关mqtt调试工具都是自己写的程序,近日也试用了一下行业明灯MQTTX,使用时有些问题1、既然支持多标签页的主题订阅和发送,为社么不把每个主题的发送数和接收数显示出来,而是只写这个连接的......
  • 02. Qt Designer的使用
    一、什么是QtDesigner  QtDesigner,中文名为Qt设计师,它是一个强大的可视化GUI设计工具。通过使用QtDesigner设计GUI程序界面,可以大大地提高开发效率。  我们可以在终端中使用pip安装pyside6模块。pipinstallpyside6二、启动QtDesigner  在用pip命......
  • 使用QT进行百度图像识别API调用
    此篇文章在2022年2月21日被记录先上视频:完成思路:1、先去百度智能云免费创建一个图片识别应用“点击我”,创建成功后可以获得APIKey与SecretKey,后续我们将通过这两个key获取access_token,很简单,通过查看官网文档可以知道获取的方法,post获取之后就可以在返回的json字符串中看......