?? dnd.html
字號:
insertText( text );
}
</pre>
你甚至可以使用<a href="qdragobject.html">QDragObject</a>的子類作為文件輸入輸出的部分。例如,如果你的程序有一個QDragObject的子類來把CAD設計編碼為DXF格式,你的保存和載入代碼也許可以是:
<pre>
void MyWidget::save()
{
<a href="qfile.html">QFile</a> out(current_file_name);
out.<a href="qfile.html#open">open</a>(IO_WriteOnly);
MyCadDrag tmp(current_design);
out.<a href="qiodevice.html#writeBlock">writeBlock</a>( tmp->encodedData( "image/x-dxf" ) );
}
void MyWidget::load()
{
<a href="qfile.html">QFile</a> in(current_file_name);
in.<a href="qfile.html#open">open</a>(IO_ReadOnly);
if ( !MyCadDrag::decode(in.<a href="qiodevice.html#readAll">readAll</a>(), current_design) ) {
QMessageBox::<a href="qmessagebox.html#warning">warning</a>( this, "Format error",
tr("The file \"%1\" is not in any supported format")
.arg(current_file_name)
);
}
}
</pre>
注意QDragObject的子類叫做“MyCadDrag”,而不是“MyDxfDrag”——因為以后也許你要把它擴展為DXF、DWG、SVF、WMF,或者甚至是<a href="qpicture.html">QPicture</a>數據到其它應用程序中。
<p> <h3><a name="drag-and-drop-action">拖放操作</a></h3>
<p> 在一些簡單的情況下,拖放的目標接收一個被拖動的數據的復制并且由源來決定是否刪除初始的拖動對象。這就是<a href="qdropevent.html">QDropEvent</a>中的“Copy”操作。目標也可以選擇理解其它操作,特別是“Move”和“Link”操作。如果目標理解了“Move”操作,<em>目標</em>就會對復制和刪除操作負責并且源自己不會再試圖刪除數據。如果目標理解了“Link”操作,它存儲它自己的初始信息的引用,并且源也不會刪除初始信息的。最通用的拖放操作是在同一個窗口部件中執行一個“Move”——請參考下面的<a href=#advanced>增強的拖放</a>一節。
<p> 拖動操作的另一個主要用法是當使用一個引用類型,比如text/uri-list,實際被拖動的數據引用了文件或對象。
<p> <h3><a name="adding-new-drag-and-drop-types">添加新的拖放類型</a></h3>
<p> 就像上面的DXF例子中建議的一樣,拖放不僅僅局限于文本和圖片。任何信息都可以被拖放。在應用程序之間拖放信息,兩個應用程序必須使用它們都能接受和產生的數據格式。這個可以使用<i><a href="http://www.rfc-editor.org/rfc/rfc1341.txt">MIME類型</a></i>來達到——拖動的源提供一個它能纏身的MIME類型的類標(按從最常用的到比較少用到的順序排列),并且拖動目標選擇一種它能接受的。例如,<a href="qtextdrag.html">QTextDrag</a>提供了“<tt>text/plain</tt>”MIME類型(普通的沒有格式的文本)和并且Unicode格式是“<tt>text/utf16</tt>”和“<tt>text/utf8</tt>”的支持,<a href="qimagedrag.html">QImageDrag</a>提供了“<tt>image/</tt><tt>*</tt>”的支持,<tt>*</tt>是<a href="qimageio.html">QImageIO</a>支持的任何一種圖片格式,并且<a href="quridrag.html">QUriDrag</a>子類提供了“<tt>text/uri-list</tt>”的支持,一個文件(或URL)的列表傳輸的標準格式。
<p> 為了實現<a href="qdragobject.html">QDragObject</a>子類中沒有支持的拖放信息的類型,首先和最重要的步驟是查找一下現存的格式中哪個是適合的——<a href="http://www.iana.org">IANA</a>(Internet Assigned Numbers Authority)在<a href="http://www.isi.edu">ISI</a>(Information Sciences Institute)提供了一個<a href="http://www.isi.edu/in-notes/iana/assignments/media-types/">MIME媒體類型的分級列表</a>。使用標準的MIME類型將會使你的應用程序和現在以及未來的其它軟件在互相操作中能夠最優化。
<p> 為了支持另外的媒體類型,繼承QDragObject或<a href="qstoreddrag.html">QStoredDrag</a>。當你需要提供對多類型進行支持,繼承QDragObject。當一個類型就足夠的時候,繼承更加簡單的QStoredDrag。
<p> QDragObject的子類將會重載<a href="qmimesource.html#format">const char* format(int i) const</a>和<a href="qmimesource.html#encodedData">QByteArray encodedData(const char* mimetype) const</a>成員,并且提供對媒體數據進行編碼和靜態成員canDecode()和對進入的數據進行解碼的decode()一套方法,和<a href="qimagedrag.html">QImageDrag</a>的<a href="qimagedrag.html#canDecode">bool canDecode(QMimeSource*) const</a>和<a href="qimagedrag.html#decode">QByteArray decode(QMimeSource*) const</a>很相似。當然,你也可以通過省略其中的一些方法對一種媒體數據只支持拖或只支持放。
<p> QStoredDrag的子類提供了對媒體數據進行編碼和靜態成員canDecode()和對進入的數據進行解碼的decode()一套方法。
<p> <h3><a name="advanced">增強的拖放</a></h3>
<p> 在剪貼板模式中,用戶可以<em>剪切</em>或<em>復制</em>源信息,然后粘貼它。相似地,在拖放模式中,用戶可以拖動信息的<em>復制</em>或者它們能夠自己拖動信息到一個新的位置(<em>移動</em>它)。拖放模式無論如何對于程序員來說都是額外的復雜:程序直到放下(粘貼)完成才會知道用戶是想剪切還是復制!在應用程序之間拖動,這個沒有什么影響,但是在一個應用程序之內進行拖動,應用程序必須多加注意以免踩到自己的腳。例如,在文檔中拖動文本,拖動的開始點和放下事件也許是這樣:
<p> <pre>
void MyEditor::startDrag()
{
<a href="qdragobject.html">QDragObject</a> *d = new <a href="qtextdrag.html">QTextDrag</a>(myHighlightedText(), this);
if ( d-><a href="qdragobject.html#drag">drag</a>() && d-><a href="qdragobject.html#target">target</a>() != this )
cutMyHighlightedText();
}
void MyEditor::dropEvent(QDropEvent* event)
{
<a href="qstring.html">QString</a> text;
if ( QTextDrag::<a href="qtextdrag.html#decode">decode</a>(event, text) ) {
if ( event->source() == this && event->action() == QDropEvent::Move ) {
// 注意不要踩到自己的腳
event->acceptAction();
moveMyHighlightedTextTo(event->pos());
} else {
pasteTextAt(text, event->pos());
}
}
}
</pre>
<p> 一些窗口部件在數據被拖動到它們上面時會問一個“是”或“否”的細節。比如,一個CAD程序也許只接收在視圖中的文本對象上放下的文本。在這種情況下,<a href="qwidget.html#dragMoveEvent">dragMoveEvent()</a>被使用并且給定一個<em>區域</em>是接受或者忽略拖動:
<pre>
void MyWidget::dragMoveEvent(QDragMoveEvent* event)
{
if ( QTextDrag::<a href="qtextdrag.html#canDecode">canDecode</a>(event) ) {
MyCadItem* item = findMyItemAt(event->pos());
if ( item )
event->accept();
}
}
</pre>
如果搜索對象的計算指令特別地慢,如果你告訴系統你允許那些區域接受請求的話,你也許可以達到更好的效果:
<pre>
void MyWidget::dragMoveEvent(QDragMoveEvent* event)
{
if ( QTextDrag::<a href="qtextdrag.html#canDecode">canDecode</a>(event) ) {
MyCadItem* item = findMyItemAt(event->pos());
if ( item ) {
<a href="qrect.html">QRect</a> r = item->areaRelativeToMeClippedByAnythingInTheWay();
if ( item->type() == MyTextType )
event->accept( r );
else
event->ignore( r );
}
}
}
</pre>
<p> 如果你需要在拖動進程開始定時器、開始滾動窗口或者合適的情況(但是不要忘記在dragMoveEvent()中停止滾動和定時器)中給出視覺效果,dragMoveEvent()也可以被使用。
<p> <h3><a name="inter-operating-with-other-applications">和其它應用程序之間的操作</a></h3>
在X11上,公有的<a class="r" href="http://www.newplanetsoftware.com/xdnd/">XDND協議</a>被使用,而Qt在Windows上使用OLE標準,并且Qt在Mac上使用Carbon拖動管理器。在X11上,XDND使用MIME,所以不需要轉換。Qt的應用編程接口與平臺無關。在Windows上,可以識別MIME的應用程序可以通過使用MIME類型命名的剪貼板格式進行通訊。一些Windows引用程序已經在它們的剪貼板格式中使用MIME命名約定了。在內部,Qt也有在專有的剪貼板格式和MIME類型之間轉換的能力。在適當時候,這個接口應該被公開,但是如果你現在需要這樣的轉換,請和你的Qt技術支持服務進行聯系。
<p> 在X11上,Qt也支持使用Motif拖放協議的拖動。重新實現中合并了由Daniel Dardailler寫的一些代碼,并且由Qt的Matt Koss <koss@napri.sk>和Trolltech修改過。這里是初始版權通告:
<p>
<p> Copyright 1996 Daniel Dardailler。
<p> 允許任何目的地使用、復制、修改、發布和銷售這個軟件并且允許沒有任何費用,上面的版權通告必須出現在所有的復制當中并且版權通告和這個允許通告要在支持文檔中出現,并且Daniel Dardailler的姓名在沒有被特定允許的情況下不能出現在和所發布的軟件相關的廣告和宣傳中。Daniel Dardailler對于這個軟件的任何目的的適用性都沒有任何責任。它僅僅提供的是“它自己”,而沒有明確或暗示任何責任。
<p> Copyright 1999 Matt Koss修改,和上面的協議相同。
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2002
<a href="http://www.trolltech.com">Trolltech</a>
<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td><a href="zh_CN.html">譯者:Cavendish</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -