zoukankan      html  css  js  c++  java
  • qt 拖放dropEvent

    1.拖放操作分为两个截然不同的动作: 拖动和放下.

    拖动通过
    void dragEnterEvent(QDragEnterEvent * event);
    来实现。
    放下通过
    void dropEvent(QDropEvent * event);
    来实现。

    需要注意的一个地方是:

    默认情况下,QTextEdit可以接受来自其他应用程序文本的拖动,并且如果用户在它上面拖放下一个文件,它会把这个文件的文件名放到QTextEdit的文本框中.

    所以当我们使用拖放的时候,应该先禁用QTextEdit的可拖放.

    this->textEdit->setAcceptDrops(false);
    this->mainWindow->setAcceptDrops(true);

    2.当用户把一个对象拖动到这个指定窗口上时,应付调用dragEnterEvent.如果对这个事件调用acceptProposedAction(),就表明用户可以在这个窗口部件上拖放对象。

        默认情况下,窗口部件是不接受拖动的。Qt会自动改变光标来向用户说明这个窗口部件是不是有效的放下点。

    void Test::dragEnterEvent(QDragEnterEvent *ev)
    {if(ev->mimeData()->hasFormat("text/uri-list"))
            ev->acceptProposedAction();
    }

    这个地方有个问题,首先看下书本上是怎么说的:

    MIME类型中的text/uri-list用于存储一系列的统一资源标识符(Universal Resource Identifier,URI),
    它们可以是文件名、统一资源定位器(Uniform Resource Locator,URL,如HTTP或者FTP路径),或者其它全局资源标识符。

    但是这个地方,并不能使用text/plain来判断txt文件 用image/jpeg来判断图片。

    因为通过下面的代码,可以发现jpeg格式的图片返回fromat也是text/uri-list.

    qDebug()<<ev->mimeData()->formats();

    而且debug显示的也没有image/jpeg
    这个是我不能理解的,这也就是说,在dragEnterEvent中只能判断到是不是文件,而不能判断到类型。不知道我的判断是不是正确的。

    3.当用户在窗口部件上放下一个对象时,就会调用dropEvent.

    void Test::dropEvent(QDropEvent *ev)
    {
        QList<QUrl> urls    = ev->mimeData()->urls();
        QString filename    = urls.first().toLocalFile();
        this->fnames        = filename;
        this->readFile(fnames);
    }
  • 相关阅读:
    Bootstrap开发框架视频整理
    在Bootstrap开发中解决Tab标签页切换图表显示问题
    在小程序中使用腾讯视频插件播放教程视频
    在小程序后端中转获取接口数据,绕过前端调用限制
    浅析Android恶意应用及其检测技术
    Android恶意软件特征及分类
    半监督学习分类——???
    强化学习的算法分类
    brew update 过慢的解决方法
    并查集模板——核心就是路径压缩
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/10272513.html
Copyright © 2011-2022 走看看