📄 dnd.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-x11-commercial-3.0.5/doc/dnd.doc:36 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Translator" content="Cavendish">
<meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt">
<title>拖放</title>
<style type="text/css"><!--
h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; font-family: "Times New Roman" }
--></style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
<a href="index.html">
<font color="#004faf">主页</font></a>
| <a href="classes.html">
<font color="#004faf">所有的类</font></a>
| <a href="mainclasses.html">
<font color="#004faf">主要的类</font></a>
| <a href="annotated.html">
<font color="#004faf">注释的类</font></a>
| <a href="groups.html">
<font color="#004faf">分组的类</font></a>
| <a href="functions.html">
<font color="#004faf">函数</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table>
<h1 align=center>拖放</h1>
<p> 拖放提供了一种用户可以在应用程序之间或之内传递信息的一种简单视觉效果机制。(在术语中,这被称为“直接操作模型”。)拖放和剪贴板的剪切和粘贴的机制相似。
<p> <ul>
<li><a href="#dragging">拖动</a></li>
<li><a href="#dropping">放下</a></li>
<li><a href="#the-clipboard">剪贴板</a></li>
<li><a href="#drag-and-drop-action">拖放操作</a></li>
<li><a href="#adding-new-drag-and-drop-types">添加新的拖放类型</a></li>
<li><a href="#advanced">增强的拖放</a></li>
<li><a href="#inter-operating-with-other-applications">和其它应用程序之间的操作</a></li>
</ul>
<p> 对于拖放的实例,请参考(随着复杂度的增加的顺序):<tt>qt/examples/iconview/simple_dd</tt>、<tt>qt/examples/dragdrop</tt>和<tt>qt/examples/fileiconview</tt>。也可以参考QMultiLineEdit窗口部件的源码。
<p> <h3><a name="dragging">拖动</a></h3>
<p> 开始一个拖动,比如是在<a href="qwidget.html#mouseMoveEvent">鼠标移动事件</a>,创建一个适合你的媒体的<a href="qdragobject.html">QDragObject</a>的子类的对象,比如对于文本使用<a href="qtextdrag.html">QTextDrag</a>,对于图片使用<a href="qimagedrag.html">QImageDrag</a>。然后调用drag()方法。这就是我们对现有类型简单的拖动所要做的一切。
<p> 例如,从一个窗口部件中开始拖动一些文本:
<pre>
void MyWidget::startDrag()
{
<a href="qdragobject.html">QDragObject</a> *d = new <a href="qtextdrag.html">QTextDrag</a>( myHighlightedText(), this );
d-><a href="qdragobject.html#dragCopy">dragCopy</a>();
// 不要删除d。
}
</pre>
<p> 注意在拖动之后,QDragObject没有被删除。这个QDragObject需要被保存直到拖放明显完成——它也许还要和其它进程通讯。最后Qt会删除这个对象。如果拥有拖动对象的窗口部件在这之前被删除,任何没有完成的放下将会被取消并且拖动对象会被删除。因为这个原因,你应该注意对象引用的是什么。
<p> <h3><a name="dropping">放下</a></h3>
<p> 为了能在一个窗口部件中接收被放下的媒体,在这个窗口部件中调用<a href="qwidget.html#setAcceptDrops">setAcceptDrops(TRUE)</a>(比如在它的构造函数中),并且重载事件处理方法<a href="qwidget.html#dragEnterEvent">dragEnterEvent()</a>和<a href="qwidget.html#dropEvent">dropEvent()</a>。对于更复杂的应用程序,重载<a href="qwidget.html#dragMoveEvent">dragMoveEvent()</a>和<a href="qwidget.html#dragLeaveEvent">dragLeaveEvent()</a>也是必需的。
<p> 例如,为了接受被放下的文本和图片:
<pre>
MyWidget::MyWidget(...) :
<a href="qwidget.html">QWidget</a>(...)
{
...
setAcceptDrops(TRUE);
}
void MyWidget::dragEnterEvent(QDragEnterEvent* event)
{
event->accept(
QTextDrag::<a href="qtextdrag.html#canDecode">canDecode</a>(event) ||
QImageDrag::<a href="qimagedrag.html#canDecode">canDecode</a>(event)
);
}
void MyWidget::dropEvent(QDropEvent* event)
{
<a href="qimage.html">QImage</a> image;
<a href="qstring.html">QString</a> text;
if ( QImageDrag::<a href="qimagedrag.html#decode">decode</a>(event, image) ) {
insertImageAt(image, event->pos());
} else if ( QTextDrag::<a href="qtextdrag.html#decode">decode</a>(event, text) ) {
insertTextAt(text, event->pos());
}
}
</pre>
<p> <h3><a name="the-clipboard">剪贴板</a></h3>
<p> <a href="qdragobject.html">QDragObject</a>、<a href="qdragenterevent.html">QDragEnterEvent</a>、<a href="qdragmoveevent.html">QDragMoveEvent</a>和<a href="qdropevent.html">QDropEvent</a>类都是<a href="qmimesource.html">QMimeSource</a>(提供类型信息的类)的子类。如果你在QDragObject中基于你的数据进行传递,你不仅要使用拖放,而且要使用使用传统的剪切和粘贴——<a href="qclipboard.html">QClipboard</a>有两个函数:
<pre>
setData(QMimeSource*)
<a href="qmimesource.html">QMimeSource</a>* data()const
</pre>
使用这些函数,你就可以很容易地把你的拖放初始信息放到剪贴板中:
<pre>
void MyWidget::copy()
{
QApplication::<a href="qapplication.html#clipboard">clipboard</a>()->setData(
new <a href="qtextdrag.html">QTextDrag</a>(myHighlightedText())
);
}
void MyWidget::paste()
{
<a href="qstring.html">QString</a> text;
if ( QTextDrag::<a href="qtextdrag.html#decode">decode</a>(QApplication::<a href="qapplication.html#clipboard">clipboard</a>()->data(), text) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -