我想在複雜的應用程序中實現複製/剪切/粘貼。
我有一個QGraphicsScene
可以包含QGraphicsItem
不同亞型的子類型,相當複雜(與Item
作爲第二個父存儲自定義屬性)。
我會複製/剪切選定的項目,並將其粘貼回原處。
我已經使用本地版本實現了它:項目列表。如何實現自定義MIME類型的剪貼板操作?
void copyItemsActionOld()
{
foreach(QGraphicsItem* qItem, selectedItems())
{
Item* newItem = (dynamic_cast<Item*>(qItem))->createItemCopy();
m_itemClipboard.append(newItem);
}
}
粘貼時,我製作剪貼板中所有項目的副本並將它們添加到場景中。就這麼簡單.....
但
我需要利用全球系統剪貼板實現它。
我看到創建一個自定義MIME類型爲QMimeData
對象上調用setData
一樣簡單,我做了後的格式名稱...(我希望這是真的)
static const QString _mimeType("application/myItem");
void copyItemsAction()
{
QMimeData* _mimeData = new QMimeData;
2 QByteArray _itemData = ?????;
_mimeData->setData(_mimeType, _itemData);
QClipboard* _clipboard = QApplication::clipboard();
_clipboard->clear();
_clipboard->setMimeData(_mimeData);
}
void pasteItemsAction()
{
QClipboard* _clipboard = QApplication::clipboard();
const QMimeData* _mimeData = _clipboard->mimeData();
QStringList _formats = _mimeData->formats();
foreach (QString _format, _formats)
{
if (_format == _mimeType)
{
QByteArray _itemData = _mimeData->data(_mimeType);
3 // then do what ? How do I parse it ?
}
}
}
我的問題
1)copyItemsAction
和pasteItemsAction
的上述片段是否接近剪貼板操作的工作方式?
2)如何將商品數據放入QByteArray
?
3)如何解析QByteArray
中的數據?
4)我需要在其他地方註冊自定義MIME類型嗎? (除了我在兩項職能上所做的之外);並將它是多平臺?
我已經爲所有項目實施了save
和load
功能。類似...
void Item::saveItem(QDataStream &outFile)
{
outFile << type;
outFile << width;
outFile << color.name();
}
我可以用它來將項目數據放在QByteArray
? (如何?)