Kopírování dat do schránky používá QMimeData stejně jako drag and drop.
Zavedeme si další formát dat application/x-shape, který opět bude přenášet řětězec znaků.
V tomto případě do řětězce znaků uložíme XML s právě vybranými grafickými prvky.
Pokud máme vybrané grafické prvky vnořené do jiných, tak to nemám dobře vyřešené.
Soubor demo.cc
void MainWindow::on_actionCopy_triggered () { QString code = ""; QXmlStreamWriter writer (& code); writeBegin (writer); for (QGraphicsItem * item : scene->selectedItems ()) { writeItem (writer, item); } writeEnd (writer); QMimeData * data = new QMimeData; data->setData (shapeFormat, code.toLatin1 ()); QClipboard * clip = QApplication::clipboard (); clip->setMimeData (data); }
Podobně “paste”.
Ze schránky vyzvedneme QMimeData.
Pokud obsahují náš formát, uložíme řetězec znaků do proměnné code a použijeme již známé funkce pro čtení XML.
void MainWindow::on_actionPaste_triggered () { QClipboard * clip = QApplication::clipboard (); const QMimeData * data = clip->mimeData (); if (data->hasFormat (shapeFormat)) { QString code = data->data (shapeFormat); QXmlStreamReader reader (code); readXml (reader, scene); } refreshTree (); }