qt int转换成qstring_Qt 自定义拖放数据对象

自定义拖放数据对象

前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对象。但是,如果你希望使用一些自定义的对象作为拖放数据,比如自定义类等等,单纯使用 QMimeData 可能就没有那么容易了。为了实现这种操作,我们可以从下面三种实现方式中选择一个:

  • 将自定义数据作为 QByteArray 对象,使用 QMimeData::setData() 函数作为二进制数据存储到 QMimeData 中,然后使用 QMimeData::Data() 读取;

  • 继承 QMimeData,重写其中的 formats() 和 retrieveData() 函数操作自定义数据;

  • 如果拖放操作仅仅发生在同一个应用程序,可以直接继承 QMimeData,然后使用任意合适的数据结构进行存储。

第一种方法不需要继承任何类,但是有一些局限:即是拖放不会发生,我们也必须将自定义的数据对象转换成 QByteArray 对象;如果你希望支持很多种拖放的数据,那么每种类型的数据都必须使用一个 QMimeData 类,这可能会导致类爆炸;如果数据很大的话,这种方式可能会降低系统的可维护性。然而,后两种实现方式就不会有这些问题,或者说是能够减小这种问题,并且能够让我们有完全控制权。我们先来看一个应用,使用 QTableWidget 来进行拖放操作,拖放的类型包括 plain/text,plain/html 和 plain/csv。如果使用第一种实现方法,我们的代码将会如下所示:

void MyTableWidget::mouseMoveEvent(QMouseEvent *event){    if (event->buttons() & Qt::LeftButton) {        int distance = (event->pos() - startPos).manhattanLength();        if (distance >= QApplication::startDragDistance())            performDrag();    }    QTableWidget::mouseMoveEvent(event);}void MyTableWidget::performDrag(){    QString plainText = selectionAsPlainText();    if (plainText.isEmpty())        return;    QMimeData *mimeData = new QMimeData;    mimeData->setText(plainText);    mimeData->setHtml(toHtml(plainText));    mimeData->setData("text/csv", toCsv(plainText).toUtf8());    QDrag *drag = new QDrag(this);    drag->setMimeData(mimeData);    if (drag->exec(Qt::CopyAction | Qt::MoveAction) == Qt::MoveAction)        deleteSelection();}  

对于这段代码,我们应该已经很容易的理解:在 performDrag() 函数中,我们调用 QMimeData 的 setText() 和 setHTML() 函数存储 plain/text 和 plain/html 数据,使用 setData() 将 text/csv 类型的数据作为二进制 QByteArray 类型存储。

QString MyTableWidget::toCsv(const QString &plainText){    QString result = plainText;    result.replace("\\", "\\\\");    result.replace("\"", "\\\"");    result.replace("\t", "\", \"");    result.replace("\n", "\"\n\"");    result.prepend("\"");    result.append("\"");    return result;}QString MyTableWidget::toHtml(const QString &plainText){    QString result = Qt::escape(plainText);    result.replace("\t", "
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值