Qt4.8.2 拖放技术

转自:http://blog.csdn.net/qq575787460/article/details/7864430


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

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

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

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

 

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

widget.h

[cpp]  view plain copy
  1. #ifndef WIDGET_H  
  2. #define WIDGET_H  
  3.   
  4. #include <QtGui/QWidget>  
  5.   
  6. class QLabel;  
  7.   
  8. class Widget : public QWidget  
  9. {  
  10.     Q_OBJECT  
  11.       
  12. public:  
  13.     Widget(QWidget *parent = 0);  
  14.     ~Widget();  
  15.   
  16. protected:  
  17.     //鼠标被拖动到窗体上时,dragEnterEvent被调用  
  18.     void dragEnterEvent(QDragEnterEvent *);  
  19.     //在可以拖放的情况下,松开鼠标,dropEvent被调用  
  20.     void dropEvent(QDropEvent *);  
  21.   
  22. private:  
  23.     //显示拖放对象的文件路径  
  24.     QLabel *labelFileName;  
  25. };  
  26.   
  27. #endif // WIDGET_H  


widget.cpp

[cpp]  view plain copy
  1. #include "widget.h"  
  2. #include <QLabel>  
  3. #include <QDragEnterEvent>  
  4. #include <QDropEvent>  
  5. #include <QUrl>  
  6. #include <QVBoxLayout>  
  7. Widget::Widget(QWidget *parent)  
  8.     : QWidget(parent)  
  9. {  
  10.     labelFileName=new QLabel;  
  11.     //设置labelFileName不接受拖放事件  
  12.     labelFileName->setAcceptDrops(false);  
  13.     //设置当前this(主窗体)接受拖放事件  
  14.     setAcceptDrops(true);  
  15.   
  16.     QVBoxLayout *mainLayout=new QVBoxLayout;  
  17.     mainLayout->addWidget(labelFileName);  
  18.     setLayout(mainLayout);  
  19. }  
  20.   
  21. Widget::~Widget()  
  22. {  
  23.       
  24. }  
  25.   
  26. /* 
  27.   如果拖放的对象具有url属性,则鼠标变成可以拖放的标识,并可以接受拖放 
  28.   否则,鼠标变成拒绝拖放的标识,即使鼠标松开,dropEvent也不会被调用 
  29. */  
  30. void Widget::dragEnterEvent(QDragEnterEvent *event)  
  31. {  
  32.     if(event->mimeData()->hasFormat("text/uri-list"))  
  33.     {  
  34.         event->acceptProposedAction();  
  35.     }  
  36. }  
  37. /* 
  38.   拖动的对象可能有多个,获得每个对象的本地url并显示 
  39. */  
  40. void Widget::dropEvent(QDropEvent *event)  
  41. {  
  42.     QList<QUrl> urls=event->mimeData()->urls();  
  43.     if(urls.isEmpty())  
  44.         return;  
  45.   
  46.     QString fileName;  
  47.     QUrl url;  
  48.     foreach(url,urls)  
  49.     {  
  50.         QString name=url.toLocalFile();  
  51.         if(!name.isEmpty())  
  52.             fileName+=name+"\n";  
  53.     }  
  54.     labelFileName->setText(fileName);  
  55. }  


main.cpp

[cpp]  view plain copy
  1. #include <QtGui/QApplication>  
  2. #include "widget.h"  
  3. #include <QTextCodec>  
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
  8.     Widget w;  
  9.     w.show();  
  10.       
  11.     return a.exec();  
  12. }  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值