2012年(46)
分类: C/C++
2012-05-07 13:36:15
摘自:http://www.cnblogs.com/rophie/archive/2012/04/14/2446915.html
拖放(Drag and Drop),是一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制,对于我们的文本编辑器来说,就是可以将一个文本文件拖到编辑区域之后我们的程序能显示这个文本文件的内容,相当于执行了打开文件的操作。
拖放包含两个截然不同的动作:拖动和放下。Drop 是将被拖放对象“放下”,前者一般是一个按下鼠标的过程,而后者则是一个松开鼠标的过程,这两者之间鼠标一直是被按下的。当然,这只是一种通常的情况,其他情况还是要看应用程序的具体实现。对于 Qt 而言,widget既可以作为 drag 对象,也可以作为 drop 对象,或者二者都是。
在头文件中重新实现了QWidget的两个事件:
protected:
dragEnterEvent (QDragEnterEvent *event);
dropEvent (QDropEvent *event);
在默认情况下,QTextEdit可以接受来自其他应用程序文本的拖动,如果用户在它上面放下文件,它将会把这个文件的名称插入到文本中,由于拖放事件是从子窗口部件传给父窗口部件的,所以通过禁用QTextEdit的放下操作以及启用主窗口的放下操作,就可以在整个MainWindow窗口中活得放下事件。
在MainWindow构造函数中:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
textEdit=new QTextEdit(this);
setCentralWidget(textEdit);
textEdit->setFocus();
textEdit->setAcceptDrops (false);
setAcceptDrops (true);
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("text/uri-list")) {
event->acceptProposedAction();
}
}
当一个对象拖动到这个窗口部件上时就会调用dragEnterEvent事件,我们通过判断文件的MIME类型,MIME类型为 text/uri-list 通常用来描述一个 URI 的列表。这些 URI 可以是文件名,也可以是 URL或者其他的资源描述符。然后调用acceptProposedAction表明用户可以拖动对象。
当用户在一个窗口部件上放下一个对象,就会调用dropEvent:
void MainWindow::dropEvent (QDropEvent *event)
{
QList
if (urls.isEmpty()) {
return;
}
QString fName = urls.first().toLocalFile();
if (fName.isEmpty()) {
return;
}
QFile file(fName);
if(file.open(QFile::ReadOnly)){
fileName=fName;
QByteArray data=file.readAll ();
textEdit->setText (QObject::tr(data));
setWindowTitle (fileName+"-QNotepad");
}
}
首先我们要获得QUrl列表,因为有可能用户会多个文件一起拖动。 然后判断是否为空,我们只判断单个文件拖动,如果拖动的URL中第一个URL不是一个本地文件名就返回。
然后就是我们熟悉的打开文件代码。
好了,到此就完成了文件编辑器的拖放操作。
对于拖动和脱离,Qt 也提供了类似的函数:dragMoveEvent() 和 dragLeaveEvent(),不过对于大部分应用而言,这两个函数的使用率要小得多。
增加了编辑菜单以及其功能,很简单,就不一一说明了,可以下载文件编辑器的源码:
作者:荒 木
出处:http://rophie.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利