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);
    }
  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/10272513.html
Copyright © 2011-2022 走看看