?? dnd.html
字號(hào):
<!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">函數(shù)</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> 拖放提供了一種用戶可以在應(yīng)用程序之間或之內(nèi)傳遞信息的一種簡(jiǎn)單視覺效果機(jī)制。(在術(shù)語中,這被稱為“直接操作模型”。)拖放和剪貼板的剪切和粘貼的機(jī)制相似。
<p> <ul>
<li><a href="#dragging">拖動(dòng)</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">增強(qiáng)的拖放</a></li>
<li><a href="#inter-operating-with-other-applications">和其它應(yīng)用程序之間的操作</a></li>
</ul>
<p> 對(duì)于拖放的實(shí)例,請(qǐng)參考(隨著復(fù)雜度的增加的順序):<tt>qt/examples/iconview/simple_dd</tt>、<tt>qt/examples/dragdrop</tt>和<tt>qt/examples/fileiconview</tt>。也可以參考QMultiLineEdit窗口部件的源碼。
<p> <h3><a name="dragging">拖動(dòng)</a></h3>
<p> 開始一個(gè)拖動(dòng),比如是在<a href="qwidget.html#mouseMoveEvent">鼠標(biāo)移動(dòng)事件</a>,創(chuàng)建一個(gè)適合你的媒體的<a href="qdragobject.html">QDragObject</a>的子類的對(duì)象,比如對(duì)于文本使用<a href="qtextdrag.html">QTextDrag</a>,對(duì)于圖片使用<a href="qimagedrag.html">QImageDrag</a>。然后調(diào)用drag()方法。這就是我們對(duì)現(xiàn)有類型簡(jiǎn)單的拖動(dòng)所要做的一切。
<p> 例如,從一個(gè)窗口部件中開始拖動(dòng)一些文本:
<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>();
// 不要?jiǎng)h除d。
}
</pre>
<p> 注意在拖動(dòng)之后,QDragObject沒有被刪除。這個(gè)QDragObject需要被保存直到拖放明顯完成——它也許還要和其它進(jìn)程通訊。最后Qt會(huì)刪除這個(gè)對(duì)象。如果擁有拖動(dòng)對(duì)象的窗口部件在這之前被刪除,任何沒有完成的放下將會(huì)被取消并且拖動(dòng)對(duì)象會(huì)被刪除。因?yàn)檫@個(gè)原因,你應(yīng)該注意對(duì)象引用的是什么。
<p> <h3><a name="dropping">放下</a></h3>
<p> 為了能在一個(gè)窗口部件中接收被放下的媒體,在這個(gè)窗口部件中調(diào)用<a href="qwidget.html#setAcceptDrops">setAcceptDrops(TRUE)</a>(比如在它的構(gòu)造函數(shù)中),并且重載事件處理方法<a href="qwidget.html#dragEnterEvent">dragEnterEvent()</a>和<a href="qwidget.html#dropEvent">dropEvent()</a>。對(duì)于更復(fù)雜的應(yīng)用程序,重載<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中基于你的數(shù)據(jù)進(jìn)行傳遞,你不僅要使用拖放,而且要使用使用傳統(tǒng)的剪切和粘貼——<a href="qclipboard.html">QClipboard</a>有兩個(gè)函數(shù):
<pre>
setData(QMimeSource*)
<a href="qmimesource.html">QMimeSource</a>* data()const
</pre>
使用這些函數(shù),你就可以很容易地把你的拖放初始信息放到剪貼板中:
<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) )
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -