Os X Yosemite Qt 拖放文件名错误

Posted

技术标签:

【中文标题】Os X Yosemite Qt 拖放文件名错误【英文标题】:Os X Yosemite Qt drag and drop file name bug 【发布时间】:2014-11-23 20:07:11 【问题描述】:

我试图在我的 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),因此寻找跨平台解决方案。

【问题讨论】:

【参考方案1】:

对,这是一个通用的

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

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

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

    克隆 Qt 5 存储库

    git clone git://gitorious.org/qt/qt5.git qt5
    

    进入克隆目录

    cd qt5
    

    初始化存储库

    perl init-repository
    

    进入需要打补丁的qtbase目录

    cd qtbase
    

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

    一个。从 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);
         

    配置项目

    ./configure -developer-build -opensource -nomake examples -nomake tests
    

    构建并安装项目

    make -j4 all install
    

    去喝杯茶,直到它准备好

【讨论】:

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

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

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

方法。

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

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

【讨论】:

以上是关于Os X Yosemite Qt 拖放文件名错误的主要内容,如果未能解决你的问题,请参考以下文章

install_name_tool 格式错误的对象(加载命令 23 cmdsize 为零) - Mac OS X Yosemite

在 Mac OS X Yosemite 上安装 Python3

在 Mac OS X Yosemite 上下载 XCode 6.1 时遇到问题

在 OS X Yosemite 10.10 (14A389) 上安装 QuickCheck for GHC 7.8.3 时出现 Clang 错误

在 Mac OS X Yosemite 10.10 上使用 Mamp Pro 进行 Mcrypt

sh 翻译:“OS X 10.10 Yosemite本地开发环境,Apache,PHP和MySQL与Homebrew”:6。在较新版本的OS X中,Sites文件夹非默认存在: