Qt实现拖拽数据的功能

今天在进行Qt编程的时候,学习了一下如何自定义ui的样式,有时候,你在修改别人程序的时候,可能会发现别人程序中的某个控件ui设计是直接拖上去的。这种情况下如果你想增加该控件的事件处理,比如拖拽功能。不太好办,今天在书上找到一个方法,就是使用Qt设计师里面的提升,将需要增加事件响应的那个控件提升到一个类里面,然后自己实现里面相关的事件响应函数,今天我成功实现了一个QTreeWidget的提升,然后把里面的数据实现了拖拽功能,代码如下:

#ifndef NEW_QTREEWIDGET_H
#define NEW_QTREEWIDGET_H

#include <QTreeWidget>

#include <QDragEnterEvent>

class new_QTreeWidget:public QTreeWidget
{
    Q_OBJECT
public:
    new_QTreeWidget(QWidget *parent = 0);
protected:
    void dragEnterEvent(QDragEnterEvent *e);
    void dragMoveEvent(QDragMoveEvent *e);
    void dropEvent(QDropEvent *e);
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
private:
    QPoint _startPos;

    void performDrag();

};


#endif // NEW_QTREEWIDGET_H

#include "new_qtreewidget.h"

#include <QMimeData>
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include <QDropEvent>
#include <QMouseEvent>
#include <QApplication>
#include <QDrag>

#include <QDebug>

new_QTreeWidget::new_QTreeWidget(QWidget *parent):QTreeWidget(parent)
{
    setAcceptDrops(true);
}

void new_QTreeWidget::dragEnterEvent(QDragEnterEvent *e)
{
    new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source());
    if(source)
    {
        e->setDropAction(Qt::MoveAction);
        e->accept();
    }
}

void new_QTreeWidget::dragMoveEvent(QDragMoveEvent *e)
{
    new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source());
    if(source)
    {
        e->setDropAction(Qt::MoveAction);
        e->accept();
    }
}

void new_QTreeWidget::dropEvent(QDropEvent *e)
{
    new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source());
    if(source)
    {
        new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source());
        if(source)
        {
            QTreeWidgetItem *item = this->itemAt(e->pos()); //当前位置的item
            if( item == nullptr)   //如果放下的位置没有item,则退出,没有这句话死机!
                return;
            if( -1 == this->indexOfTopLevelItem(item) && (-1 == this->indexOfTopLevelItem(currentItem())) ||
                -1 != this->indexOfTopLevelItem(item) && (-1 != this->indexOfTopLevelItem(currentItem()))
               )  //如果“放下位置的item是顶层item,且原来的是顶层”或者“放下的不是顶层,且原来也不是顶层”
            {
                qDebug()<<"放下的文本是:"<<e->mimeData()->text();
                item->setText(currentColumn(),e->mimeData()->text());
                e->setDropAction(Qt::MoveAction);
                e->accept();
            }
        }
    }
}

void new_QTreeWidget::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)
    {
        _startPos = e->pos();
    }
    QTreeWidget::mousePressEvent(e);
}

void new_QTreeWidget::mouseMoveEvent(QMouseEvent *e)
{
    if(e->buttons() & Qt::LeftButton)
    {
        int distance = (e->pos() - _startPos).manhattanLength();
        if(distance >= QApplication::startDragDistance())   //当拖动距离大于一个推荐抖动距离时,表示同意已经拖动操作了
            performDrag();
    }
    QTreeWidget::mouseMoveEvent(e);
}

void new_QTreeWidget::performDrag()
{
    QTreeWidgetItem *item = currentItem();
    int column = currentColumn();
    if(item)  //必须是非顶层item才可以移动数据
//    if(item)
    {
        QMimeData *mineData = new QMimeData;
        if(column != 4)   //只有第四列才可以移动数据
            return;
        mineData->setText(item->text(column));
        qDebug()<<item->text(column);

        QDrag *drag = new QDrag(this);
        drag->setMimeData(mineData);
        drag->exec(Qt::MoveAction);
    }
}

这样就解决了当界面已经设置好后如何添加功能的难题!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值