QMimeData 是 Qt 中数据交换的标准化载体。粘贴复制,跨应用的标准格式。也能自定义数据类型




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. 典型使用流程(对应你代码中的复制 / 粘贴)
    (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()) {
            // 复制图形项、添加到场景...
        }
    }
}
相关推荐
西飘客4 小时前
vs 怎么根据dll 生成lib文件
c++·qt
bkspiderx5 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
半杯咖啡半行码7 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
时间的拾荒人8 小时前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
MayZork9 小时前
Qt 文件操作:QSaveFile 与 QTemporaryFile(含 QTemporaryDir)实战
开发语言·qt
半杯咖啡半行码12 小时前
Qt 开发基础:版本演进、常用工具与多平台安装
开发语言·qt
qq_4017004117 小时前
Qt Signal Mapper:一堆按钮,怎么共用一个槽函数
开发语言·qt
Python图像识别17 小时前
35-【2027毕设】YOLO11中草药检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
Lhan.zzZ18 小时前
Qt/QML:业务记录单展示、签名确认与 PDF 导出开发
c++·qt·pdf
Quz1 天前
QML 动画选择:GIF与Lottie 的区别,以及 Qt 6.8 与 6.11 的 Lottie 实现差异
qt