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);
    }
}

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页