Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7688014
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2013-12-23 15:08:38

拖放(Drag and Drop),通常会简称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制。

拖放其实是由两部分组成的:拖动和释放。拖动是将被拖放对象进行移动,释放是将被拖放对象放下。前者是一个按下鼠标按键并移动的过程,后者是一个松开鼠标按键的过程;通常这两个操作之间的鼠标按键是被一直按下的。

我们需要重写 dragEnterEvent() 和 dropEvent() 两个函数。顾名思义,前者是拖放进入的事件,后者是释放鼠标的事件。

点击(此处)折叠或打开

  1. void MainWindow::dragEnterEvent(QDragEnterEvent *event)
  2. {
  3.     if (event->mimeData()->hasFormat("text/uri-list")) {
  4.         event->acceptProposedAction();
  5.     }
  6. }

当用户将对象拖动到组件上面时,系统会回调 dragEnterEvent() 函数。如果我们在事件处理代码中调用 acceptProposeAction() 函数,就可以向用户暗示,你可以将拖动的对象放在这个组件上。默认情况下,组件是不会接受拖放的。如果我们调用了这个函数,那么 Qt 会自动以光标样式的变化来提示用户是否可以将对象放在组件上。在这里,我们希望告诉用户,窗口可以接受拖放,但是我们仅接受某一种类型的文件,而不是全部文件。我们首先检查拖放文件的 MIME 类型信息。关于 MIME 类型的详细信息,请参考

我们便接受这个动作。

点击(此处)折叠或打开

  1. void MainWindow::dropEvent(QDropEvent *event)
  2. {
  3.     QList urls = event->mimeData()->urls();
  4.     if (urls.isEmpty()) {
  5.         return;
  6.     }

  7.     QString fileName = urls.first().toLocalFile();
  8.     if (fileName.isEmpty()) {
  9.         return;
  10.     }

  11.     ......
  12. }

当用户将对象释放到组件上面时,系统回调 dropEvent() 函数。我们使用QMimeData::urls() 来获得 QUrl 的一个列表。通常,这种拖动应该只有一个文件,但是也不排除多个文件一起拖动。因此我们需要检查这个列表是否为空,如果不为空,则取出第一个,否则立即返回。

 
返回目录:Qt学习整理
阅读(2604) | 评论(0) | 转发(1) |
0

上一篇:QStringListModel

下一篇:Qt剪贴板

给主人留下些什么吧!~~