全部博文(372)
2012年(372)
分类: 虚拟化
2012-04-14 19:38:01
拖放包含两个截然不同的动作:拖动和放下。Drop 是将被拖放对象“放下”,前者一般是一个按下鼠标的过程,而后者则是一个松开鼠标的过程,这两者之间鼠标一直是被按下的。当然,这只是一种通常的情况,其 他情况还是要看应用程序的具体实现。对于 Qt 而言,widget既可以作为 drag 对象,也可以作为 drop 对象,或者二者都是。
在头文件中重新实现了QWidget的两个事件:
在默认情况下,QTextEdit可以接受来自其他应用程序文本的拖动,如果用户在它上面放下文件,它将会把这个文件的名称插入到文本中,由于拖放事件是从子窗口部件传给父窗口部件的,所以通过禁用QTextEdit的放下操作以及启用主窗口的放下操作,就可以在整个MainWindow窗口中活得放下事件。
在MainWindow构造函数中:
当一个对象拖动到这个窗口部件上时就会调用dragEnterEvent事件,我 们通过判断文件的MIME类型,MIME类型为 text/uri-list 通常用来描述一个 URI 的列表。这些 URI 可以是文件名,也可以是 URL或者其他的资源描述符。然后调用acceptProposedAction表明用户可以拖动对象。
当用户在一个窗口部件上放下一个对象,就会调用dropEvent:
首先我们要获得QUrl列表,因为有可能用户会多个文件一起拖动。 然后判断是否为空,我们只判断单个文件拖动,如果拖动的URL中第一个URL不是一个本地文件名就返回。
然后就是我们熟悉的打开文件代码。
好了,到此就完成了文件编辑器的拖放操作。
对于拖动和脱离,Qt 也提供了类似的函数:dragMoveEvent() 和 dragLeaveEvent(),不过对于大部分应用而言,这两个函数的使用率要小得多。
增加了编辑菜单以及其功能,很简单,就不一一说明了,可以下载文件编辑器的源码:
源码下载:QNotepad