Os X Yosemite Qt 拖放文件名错误
我试图在我的 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:
克隆 Qt 5 存储库
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);
}
配置项目
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
相关文章