Os X Yosemite Qt 拖放文件名错误
Posted
技术标签:
【中文标题】Os X Yosemite Qt 拖放文件名错误【英文标题】:Os X Yosemite Qt drag and drop file name bug 【发布时间】: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/<myName>/Desktop/<filename>
的内容。但我看到类似 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文件夹非默认存在: