2014-11-23 61 views
6

我試圖在我的Qt應用程序中使用簡單的拖放功能。這是我的代碼:Os X優勝美地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之外的所有操作系統,該應用程序崩潰。

這是一個已知的bug,發佈爲here,補丁here。但我不知道如何使用該補丁來使我的代碼工作。似乎有圍繞Qt的Objective C包裝的解決方案,但是,我不知道如何在Qt和Objective C中混合使用C++。

任何想法如何使用該補丁或使其工作其他方式?不知何故,我需要檢索被刪除文件的實際完整路徑。

環境 - OS X優勝美地,Qt Creator 3.1.1與Qt 5.2.1。

我需要在Windows上運行相同的應用程序(我們正在爲Windows和Mac開發Qt),因此尋找跨平臺解決方案。

回答

4

權,這是一個普通的

如何修補了Qt源,以修復錯誤或添加新功能?

要求。這對整體文件可能是有用的,因此這裏得到答案。

你可以抓住官方發佈的tarball和補丁,沒有混帳或者你可以通過存儲庫。我個人會選擇第二個補丁,因爲我覺得比較簡單,用git進行櫻桃採摘比較容易。這些都是你需要採取的步驟:

  1. 克隆了Qt 5庫

    git clone git://gitorious.org/qt/qt5.git qt5 
    
  2. 轉到克隆目錄

    cd qt5 
    
  3. 初始化庫

    perl init-repository 
    
  4. 轉到你需要修補

    cd qtbase 
    
  5. 創建一個帳戶格里特如果你有沒有卻​​把qtbase目錄。這一步是可選的。

  6. a。取並從格里特

enter image description here

git fetch https://[email protected]/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 <[email protected]> 
    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 
    
  • 去喝茶,直到它準備

  • +0

    讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/67486/discussion-between-cupidvogel-and-lpapp)。 – SexyBeast 2014-12-22 18:26:18

    +0

    僅供參考,我建議不要使用-J4。看起來使用-J4時可能會發生一些競爭條件並且無法建立。它更長,但我建議只使用-j1 – Seb 2015-01-12 16:45:40

    +0

    FYI,這已在Qt 5.4.1中修復。 [QTBUG-40449](https://bugreports.qt.io/browse/QTBUG-40449) – Shinnok 2015-03-17 08:39:48

    2

    應用補丁,你需要下載Qt的來源,然後添加使用檢索文件路徑,而不是FILEID所需要的線路(如使用git):

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

    方法。

    這裏是應該補充的部分:Patch Code

    當你這樣做,你需要建立Qt和與此補丁版本構建項目採取使用您所做的更改。