Os X Yosemite Qt拖放文件名错误 [英] Os X Yosemite Qt drag and drop file name bug
问题描述
我试图在我的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.
这是一个已知的错误,因为已发布此处,补丁此处。但我不知道如何使用补丁,使我的代码工作。似乎有一个解决方案与Objective C包装Qt,但是,我不知道如何确切地混合C + +在Qt和目标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:
-
复制Qt 5存放区
Clone the Qt 5 repository
git clone git://gitorious.org/qt/qt5.git qt5
li>
转到克隆目录
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.
a。从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);
}
-
配置项目
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
这篇关于Os X Yosemite Qt拖放文件名错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!