2012-12-07 60 views
3

我正在開發一個Qt應用程序來存儲任何通過剪貼板,以便我可以稍後恢復。我的方法是從QApplication::clipboard()中檢索QMimeData,並將其存儲在QList<QMimeData *>中。由於剪貼板中的數據是不穩定的,我必須複製QClipboard::mimeData()返回的QMimeData。 沒有複製構造QMimeData所以我想,我會複製這樣的:正確的方法來複制一個QMimeData對象

const QMimeData * clipboardData = _clipboard->mimeData(); 
QMimeData * mimeCopy = new QMimeData(); 

foreach(const QString & format, clipboardData->formats()) 
    mimeCopy->setData(format, clipboardData->data(format)) 

其中_clipboardQApplication::clipboard()

除了某些特定於應用程序的MIME類型外,此工作比較好。例如,我注意到當我複製,恢復並在Skype對話中粘貼Skype消息時,該消息不再被引用。這是否證明我的副本有缺陷?有更好,更準確的方法來複制QMimeData嗎?

經過一番調試,我發現在Skype消息mimedata中有兩種格式。 A Text/Plain類型包含消息本身的文本和application/x-qt-windows-mime;value="SkypeMessageFragment"類型,其中包含一些類似XML的數據。 Qt's documentation on MIME types指示value="..."描述數據如何被編碼。我需要在某些時候編碼或解碼某些內容以使我的QMimeData的副本有效嗎?

回答

2

對於像application/x-qt-windows-mime;value="SomeValue"這樣的自定義MIME類型,實際格式名實際上是SomeValue(在兩個引號之間的value=之後)。

一個複製QMimeData對象,然後將這樣的更準確的方法:

QMimeData * copyMimeData(const QMimeData * mimeReference) 
{ 
    QMimeData * mimeCopy = new QMimeData(); 

    foreach(QString format, mimeReference->formats()) 
    { 
     // Retrieving data 
     QByteArray data = mimeReference->data(format); 
     // Checking for custom MIME types 
     if(format.startsWith("application/x-qt")) 
     { 
      // Retrieving true format name 
      int indexBegin = format.indexOf('"') + 1; 
      int indexEnd = format.indexOf('"', indexBegin); 
      format = format.mid(indexBegin, indexEnd - indexBegin); 
     } 
     mimeCopy->setData(format, data); 
    } 

    return mimeCopy; 
} 
相關問題