



cpp
// 示例:自定义 MIME 数据类(对应你代码中的 ShapeMimeData)
class ShapeMimeData : public QMimeData
{
Q_OBJECT
public:
// 构造函数:传入要传递的图形项列表
ShapeMimeData(const QList<QGraphicsItem*> &items)
: m_items(items)
{
// 关键:设置自定义 MIME 类型,标识这是「图形项数据」
setData("application/x-draw-shape", QByteArray());
}
// 获取自定义数据(图形项列表)
QList<QGraphicsItem*> items() const { return m_items; }
// 重写 hasFormat:告诉外部「我支持这个自定义类型」
bool hasFormat(const QString &mimeType) const override
{
return mimeType == "application/x-draw-shape" || QMimeData::hasFormat(mimeType);
}
private:
QList<QGraphicsItem*> m_items; // 存储自定义的图形项数据
};
- 典型使用流程(对应你代码中的复制 / 粘贴)
(1)复制(封装数据)
cpp
void MainWindow::on_copy()
{
QGraphicsScene *scene = activeMdiChild()->scene();
// 1. 创建自定义 MIME 数据,封装选中的图形项
ShapeMimeData *data = new ShapeMimeData(scene->selectedItems());
// 2. 把 MIME 数据设置到剪贴板
QApplication::clipboard()->setMimeData(data);
}
(2)粘贴(解析数据)
cpp
void MainWindow::on_paste()
{
QGraphicsScene *scene = activeMdiChild()->scene();
// 1. 从剪贴板获取 MIME 数据
const QMimeData *mimeData = QApplication::clipboard()->mimeData();
// 2. 转换为自定义的 ShapeMimeData(判断类型)
const ShapeMimeData *shapeData = dynamic_cast<const ShapeMimeData*>(mimeData);
if (shapeData) {
// 3. 获取封装的图形项数据,执行粘贴逻辑
foreach (QGraphicsItem *item, shapeData->items()) {
// 复制图形项、添加到场景...
}
}
}
