Qt4.8.2 拖放技术

原文:http://www.chineselinuxuniversity.net/articles/52558.shtml,并且参考《Qt学习之路》

拖放技术由两部分组成:拖Drag、放Drop。

拖:按下鼠标并且移动鼠标以拖动对象。

放:鼠标松开的过程。拖和放之间,鼠标是一直按着的。

 

下面的小程序实现了:当拖动具有某种属性的对象到窗体时,鼠标显示可以拖放。鼠标松开时,在窗体的label上显示文件路径。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>

class QLabel;

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(QWidget *parent = 0);
    ~Widget();

protected:
    //鼠标被拖动到窗体上时,dragEnterEvent被调用
    void dragEnterEvent(QDragEnterEvent *);
    //在可以拖放的情况下,松开鼠标,dropEvent被调用
    void dropEvent(QDropEvent *);

private:
    //显示拖放对象的文件路径
    QLabel *labelFileName;
};

#endif // WIDGET_H


widget.cpp

#include "widget.h"
#include <QLabel>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QUrl>
#include <QVBoxLayout>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    labelFileName=new QLabel;
    //设置labelFileName不接受拖放事件
    labelFileName->setAcceptDrops(false);
    //设置当前this(主窗体)接受拖放事件
    setAcceptDrops(true);

    QVBoxLayout *mainLayout=new QVBoxLayout;
    mainLayout->addWidget(labelFileName);
    setLayout(mainLayout);
}

Widget::~Widget()
{
    
}

/*
  如果拖放的对象具有url属性,则鼠标变成可以拖放的标识,并可以接受拖放
  否则,鼠标变成拒绝拖放的标识,即使鼠标松开,dropEvent也不会被调用
*/
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("text/uri-list"))
    {
        event->acceptProposedAction();
    }
}
/*
  拖动的对象可能有多个,获得每个对象的本地url并显示
*/
void Widget::dropEvent(QDropEvent *event)
{
    QList<QUrl> urls=event->mimeData()->urls();
    if(urls.isEmpty())
        return;

    QString fileName;
    QUrl url;
    foreach(url,urls)
    {
        QString name=url.toLocalFile();
        if(!name.isEmpty())
            fileName+=name+"\n";
    }
    labelFileName->setText(fileName);
}


main.cpp

#include <QtGui/QApplication>
#include "widget.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    Widget w;
    w.show();
    
    return a.exec();
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值