QT窗口中的拖动

                                                                               QT窗口中的拖动
例如:下面有两个列表框,把其中一个列表框中的一项拖动到另外一个列表框中

                                   下面是拖动之后的图片

 

实现思路:

重新写一个myListWidget类继承于系统的QListWidget类

里面重新写5个系统事件:(.h文件中)

void mousePressEvent(QMouseEvent *event);                               //鼠标按下事件

void mouseMoveEvent(QMouseEvent *event);                               //鼠标移动事件

void dragEnterEvent(QDragEnterEvent *event);                              //myListWidget检测到有东西拖过来触发的事件 

void dropEvent(QDropEvent *event);                                              //拖动放到目标位置触发的事件

void dragMoveEvent(QDragMoveEvent *e);                                    //拖动过程中触发的事件

void Init();                                                            //初始化函数

 

.cpp文件中

void myListWidget::Init()

{

           this->setAcceptDrops(true);                                   //设置this可以接受拖动,没有这个不会触发拖动事件

           QFont* font = new QFont("微软雅黑",25,3);           //字体

           this->setFont(*font);            //设置窗口字体,

}

                             //头文件中添加#include <QMouseEvent>
void myListWidget::mousePressEvent(QMouseEvent *event)    //如果没有这个事件则不能选定列表项
{
    if(event->button()&Qt::LeftButton)             //只有左键按下时才为真
    {
        QListWidget::mousePressEvent(event);         //持续触发鼠标按下,直到有别的操作
    }
}
            

                           //头文件中添加#include <mouseMoveEvent>
void myListWidget::mouseMoveEvent(QMouseEvent *event)      
{
    if(event->button()&Qt::LeftButton)             //只有左键按下时才能拖动
    {
        QListWidgetItem* list_01 = this->currentItem();           //得到当前选中的列表项
        if(list_01)
        {
            QMimeData* mimdata = new QMimeData();     //头文件中添加#include <QMimeData>
                    //把当前选中列表项的文本保存到QMimeData中,以后可以在DropEvent中取出来
            mimdata->setText(list_01->text());
            

            QDrag* drag = new QDrag(this);
                    //把mimdata中保存的数据随着拖动发送到另一个窗口中
            drag->setPixmap(QPixmap("     这里面写图标路径    "));
                    //设置拖动过程中显示的图标
            drag->setMimeData(mimdata);
                    //把mimdata设置到drag中
            drag->exec(Qt::MoveAction);
                    //启动drag,参数表示drag类型,因为这里是拖动所以是Qt::MoveAction
            
            delete list_01;        //释放list_01,把原ListWidget中的拖动项删除掉
            QListWidget::mouseMoveEvent(event);       //持续触发鼠标移动,直到有别的操作
        }
    }
}



                      //头文件中添加#include <QDragEnterEvent>
void mylistWidget::dragEnterEvent(QDragEnterEvent *event)   
{
    QListWidget* listwidget = qobject_cast<QListWidget*>(event->source());
    //取得拖动事件触发的原object,这里的qobject_cast<QListWidget*>是Qt中的类型转换



    if(listwidget != NULL && listwidget != this)    
    {
        event->setDropAction(Qt::MoveAction);  //  设置拖动属性
        event->accept();         //持续接受
    }
}


                //头文件中添加#include <QDragMoveEvent>
void mylistWidget::dragMoveEvent(QDragMoveEvent *e)            
{
    QListWidget* listwidget = qobject_cast<QListWidget*>(e->source());
    if(listwidget != NULL && listwidget != this)
    {
        e->setDropAction(Qt::MoveAction);
        e->accept();
    }
}

                       //头文件中添加#include <QDropEvent>
void mylistWidget::dropEvent(QDropEvent *event)
{

    QListWidget* listwidget = qobject_cast<QListWidget*>(event->source());
    if(listwidget != NULL && listwidget != this)
    {
        QString str = event->mimeData()->text();                  
                //取得mouseMoveEvent事件中设置的mimdata中的值

        QListWidgetItem* l1 = new QListWidgetItem(str);
        this->addItem(l1);              

        this->setCurrentItem(l1);             //设置列表项焦点


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


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值