Os X Yosemite Qt 拖放文件名错误

2022-01-11 00:00:00 qt drag-and-drop osx-yosemite c++

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

I was trying to use a simple drag and drop feature in my Qt app. Here is my code:

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/<myName>/Desktop/<filename> 的内容.但我看到类似 file:///.file/id=6571367.2773272/ 的内容正在打印.当我尝试以某种方式使用它时,例如在我的内置编辑器中打开文件(文本),该编辑器适用于除 Os X Yosemite 之外的所有操作系统,应用程序崩溃.

As you see, it simply prints the path name of the file bing dropped into the console. So when I dragged and dropped a file from my desktop into the widget, I expected something like /Users/<myName>/Desktop/<filename> in the console. But I see something like file:///.file/id=6571367.2773272/ being printed. And when I try to use it in some way, like opening the file (text) in my in-built editor, which was working fine for all OS-es except Os X Yosemite, the app crashes.

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

It is a known bug, as published here, with a patch here. But I don't know how to use the patch to make my code work. There seems to be a solution with an Objective C wrapper around Qt, however, I don't know how exactly to mix C++ in Qt and Objective C.

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

Any idea how do I use the patch, or make it work in some other way? Somehow I need to retrieve the actual full path of the file being dropped.

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

Environment - Os X Yosemite, Qt Creator 3.1.1 with Qt 5.2.1.

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

I will need to run the same app on Windows as well (we are developing in Qt for both Windows and Mac), so looking for cross-platform solution.

推荐答案

对,这个是通用的

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

How do I patch the Qt source in order to fix a bug or add a feature?

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

request. This may be useful to document in general, therefore here goes the answer.

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

You could grab the official release tarball and patch that without git or you can go through the repository. I would personally opt for the second since patching and cherry-picking with git is easier in my humble opinion. These are the steps that you need to take:

  1. 克隆 Qt 5 存储库

  1. Clone the Qt 5 repository

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

  • 进入克隆目录

  • Go to the cloned directory

    cd qt5
    

  • 初始化存储库

  • Initialize the repository

    perl init-repository
    

  • 进入需要打补丁的qtbase目录

  • Go to the qtbase directory which you need to patch

    cd qtbase
    

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

  • Create a gerrit account if you have none yet. This step is optional.

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

    a. Fetch and cherry-pick the fix from Gerrit

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

    b.不要创建 Gerrit 帐户

    b. Do not create a gerrit account

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

    This will be feasible in this case since it is a very minor change to the source code, and all the rest is just change to the benchmarks. There are no expected updates to the craft of the change, either.

        * 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. 配置项目

    1. Configure the project

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

  • 构建并安装项目

  • Build and install the project

    make -j4 all install
    

  • 去喝杯茶,直到它准备好

  • Go get some tea until it is ready

  • 相关文章