【问题标题】:Os X Yosemite Qt drag and drop file name bugOs X Yosemite Qt 拖放文件名错误
【发布时间】:2015-01-21 12:11:03
【问题描述】:

我试图在我的 Qt 应用程序中使用简单的拖放功能。这是我的代码:

MyWindow::MyWindow(QWidget *parent)
{
    ..........
    setAcceptDrops(true);
}

void MyWindow::dragEnterEvent(QDragEnterEvent *e)
{
    if (e->mimeData()->hasUrls()) {
        e->acceptProposedAction();
    }
}

void MyWindow::dropEvent(QDropEvent *e)
{
    foreach (const QUrl &url, e->mimeData()->urls()) {
        const QString &fileName = url.toLocalFile();
        qDebug() << "Dropped file:" << fileName;
    }
}

如您所见,它只是打印放入控制台的文件 bing 的路径名。因此,当我将一个文件从我的桌面拖放到小部件中时,我希望控制台中有类似 /Users/&lt;myName&gt;/Desktop/&lt;filename&gt; 的内容。但我看到类似 file:///.file/id=6571367.2773272/ 的内容正在打印。当我尝试以某种方式使用它时,例如在我的内置编辑器中打开文件(文本),该编辑器对除 Os X Yosemite 之外的所有操作系统都运行良好,应用程序崩溃。

这是一个已知的错误,已发布here,带有补丁here。但我不知道如何使用补丁来使我的代码工作。似乎有一个围绕 Qt 的 Objective C 包装器的解决方案,但是,我不知道如何在 Qt 和 Objective C 中准确地混合 C++。

知道如何使用补丁,或者以其他方式使其工作吗?不知何故,我需要检索被删除文件的实际完整路径。

环境 - Os X Yosemite、Qt Creator 3.1.1 和 Qt 5.2.1。

我还需要在 Windows 上运行相同的应用程序(我们正在为 Windows 和 Mac 使用 Qt 开发),因此寻找跨平台解决方案。

【问题讨论】:

    标签: c++ qt drag-and-drop osx-yosemite


    【解决方案1】:

    对,这是一个通用的

    如何修补 Qt 源代码以修复错误或添加功能?

    请求。这可能对一般文档有用,因此答案如下。

    您可以获取官方发布的 tarball 并在没有 git 的情况下对其进行修补,或者您可以通过存储库。我个人会选择第二个,因为在我看来,使用 git 进行修补和挑选更容易。以下是您需要采取的步骤:

    1. 克隆 Qt 5 存储库

      git clone git://gitorious.org/qt/qt5.git qt5
      
    2. 进入克隆目录

      cd qt5
      
    3. 初始化存储库

      perl init-repository
      
    4. 进入需要打补丁的qtbase目录

      cd qtbase
      
    5. 如果您还没有 gerrit 帐户,请创建一个。此步骤是可选的。

    6. 一个。从 Gerrit 获取并挑选修复程序

        git fetch https://yourgerritusername@codereview.qt-project.org/qt/qtbase refs/changes/11/92611/4 && git cherry-pick FETCH_HEAD
    

    b.不要创建 Gerrit 帐户

    这在这种情况下是可行的,因为它是对源代码的一个非常小的改动,其余的只是对基准的改动。变化的工艺也没有预期的更新。

        * git apply
        * copy and paste the following snippet to the standard input
    
        commit 66a305f282e33b1bf12bec21f416c8ba6730cd40
        Author: Cyril Oblikov <munknex@gmail.com>
        Date:   Tue Aug 19 16:18:25 2014 +0300
    
            OSX: convert file reference url to path-based url
    
            According to Apple's spec URL can be:
            path-based URL: file://localhost/Users/steve/Documents/MyFile.txt
            or
            file reference URL: file:///.file/id=6571367.2773272/
    
            On OSX 10.10 file reference urls are copied to clipboard during Drag&Drop.
    
            This patch converts file reference url to path-based url.
    
            Comment on performance: converting 1000 urls on Macbook Air 2013 takes
            about 15 ms.
    
            Also benchmark is added.
    
            Change-Id: Ia42386cd90d1eb11d04ab33705f5eece6c13f370
    
        diff --git a/src/platformsupport/clipboard/qmacmime.mm b/src/platformsupport/clipboard/qmacmime.mm
        index 6fcd19e..2bb623f 100644
        --- a/src/platformsupport/clipboard/qmacmime.mm
        +++ b/src/platformsupport/clipboard/qmacmime.mm
        @@ -614,6 +614,8 @@ QVariant QMacPasteboardMimeFileUri::convertToMime(const QString &mime, QList<QBy
                 QUrl url = QUrl::fromEncoded(data.at(i));
                 if (url.host().toLower() == QLatin1String("localhost"))
                 url.setHost(QString());
        +        if (url.host().isEmpty() && url.path().startsWith(QLatin1String("/.file/id=")))
        +            url = QUrl::fromNSURL([url.toNSURL() filePathURL]);
                 url.setPath(url.path().normalized(QString::NormalizationForm_C));
                 ret.append(url);
             }
    
    1. 配置项目

      ./configure -developer-build -opensource -nomake examples -nomake tests
      
    2. 构建并安装项目

      make -j4 all install
      
    3. 去喝杯茶,直到它准备好

    【讨论】:

    • 仅供参考,我建议不要使用 -J4。似乎在使用 -J4 时可能会发生某些竞争条件并且无法构建。它更长,但我建议只使用 -j1
    • 仅供参考,这已在 Qt 5.4.1 中修复。 QTBUG-40449
    【解决方案2】:

    要应用补丁,您需要下载 Qt 源代码(例如使用 git),然后使用以下命令添加检索文件路径而不是 fileId 所需的行:

    QUrl::fromNSURL([url.toNSURL() filePathURL]);
    

    方法。

    这里是应该添加的部分:Patch Code

    当您执行此操作时,您需要构建 Qt 并使用此修补版本构建您的项目,以利用您所做的更改。

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多