2014-11-23 9 views
6

मैं अपने क्यूटी ऐप में एक साधारण ड्रैग और ड्रॉप सुविधा का उपयोग करने की कोशिश कर रहा था। यहां मेरा कोड है:ओएस एक्स योसेमेट क्यूटी ड्रैग और ड्रॉप फ़ाइल नाम बग

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; 
    } 
} 

जैसा कि आप देखते हैं, यह बस कंसोल में डाली गई फ़ाइल बिंग के पथ नाम को प्रिंट करता है। इसलिए जब मैंने अपने डेस्कटॉप से ​​विजेट में एक फ़ाइल खींच ली और गिरा दी, तो मुझे कंसोल में /Users/<myName>/Desktop/<filename> जैसे कुछ की उम्मीद थी। लेकिन मुझे कुछ ऐसा लगता है जैसे file:///.file/id=6571367.2773272/ मुद्रित किया जा रहा है। और जब मैं इसे किसी भी तरह से उपयोग करने का प्रयास करता हूं, जैसे कि मेरे इन-बिल्ट एडिटर में फ़ाइल (टेक्स्ट) खोलना, जो ओएस एक्स योसेमेट को छोड़कर सभी ओएस-एसएस के लिए ठीक काम कर रहा था, ऐप क्रैश हो जाता है।

यह एक ज्ञात बग है, जैसा कि here प्रकाशित है, पैच here के साथ। लेकिन मुझे नहीं पता कि मेरे कोड को काम करने के लिए पैच का उपयोग कैसे करें। क्यूटी के आस-पास एक उद्देश्य सी रैपर के साथ एक समाधान प्रतीत होता है, हालांकि, मुझे नहीं पता कि क्यूटी और उद्देश्य सी में सी ++ को कैसे मिश्रण करना है।

कोई विचार मैं पैच का उपयोग कैसे करूं या इसे कैसे काम करूं कुछ और रास्ता? किसी भी तरह मुझे फ़ाइल को छोड़ने के वास्तविक पूर्ण पथ को पुनः प्राप्त करने की आवश्यकता है।

पर्यावरण - ओएस एक्स योसामेट, क्यूटी निर्माता 3.1.1 क्यूटी 5.2.1 के साथ।

मुझे विंडोज़ पर एक ही ऐप चलाने की आवश्यकता होगी (हम विंडोज और मैक दोनों के लिए क्यूटी में विकसित हो रहे हैं), इसलिए क्रॉस-प्लेटफ़ॉर्म समाधान की तलाश में।

उत्तर

4

ठीक है, यह एक सामान्य

मैं कैसे क्यूटी स्रोत के लिए एक सुविधा के लिए एक बग को ठीक या जोड़ने के लिए पैच करते हैं?

अनुरोध। यह सामान्य रूप से दस्तावेज़ के लिए उपयोगी हो सकता है, इसलिए यहां जवाब दिया जाता है।

आप आधिकारिक रिलीज टैरबॉल और पैच को पकड़ सकते हैं कि बिना गिट के या आप भंडार के माध्यम से जा सकते हैं। मैं व्यक्तिगत रूप से दूसरे के लिए चुनता हूं क्योंकि पैचिंग और चेरी-पिकिंग मेरी विनम्र राय में आसान है।भंडार

perl init-repository 
प्रारंभ

  1. क्लोन क्यूटी 5 भंडार

    git clone git://gitorious.org/qt/qt5.git qt5 
    
  2. जाओ क्लोन निर्देशिका

    cd qt5 
    
  3. लिए: ये चरण है कि आप करने की आवश्यकता है

  4. जाओ qtbase निर्देशिका जो आप पैच करने के लिए

    cd qtbase 
    
  5. एक Gerrit खाता बनाने के अगर आप अभी तक कोई नहीं है की जरूरत है। यह कदम वैकल्पिक है।

  6. ए। प्राप्त करें और Gerrit

enter image description here

git fetch https://[email protected]/qt/qtbase refs/changes/11/92611/4 && git cherry-pick FETCH_HEAD 

ख से ठीक चेरी लेने। एक गेरिट खाता न बनाएं

यह इस मामले में व्यवहार्य होगा क्योंकि यह स्रोत कोड में बहुत मामूली परिवर्तन है, और शेष बाकी केवल बेंचमार्क में बदल जाते हैं। परिवर्तन के शिल्प के लिए कोई अपेक्षित अपडेट नहीं हैं, या तो।

* 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); 
     } 
  1. कॉन्फ़िगर परियोजना

    ./configure -developer-build -opensource -nomake examples -nomake tests 
    
  2. बिल्ड और परियोजना

    make -j4 all install 
    
  3. जाओ कुछ चाय मिल स्थापित जब तक यह तैयार है

+0

हमें [चैट में इस चर्चा को जारी रखें] (http://chat.stackoverflow.com/rooms/67486/discussion-between-cupidvogel-and-lpapp)। – SexyBeast

+0

बस जानकारी के लिए, मैं -जे 4 का उपयोग करने की सलाह नहीं दूंगा। ऐसा लगता है कि कुछ दौड़ की स्थिति हो सकती है और -4 का उपयोग करते समय निर्माण करने में असफल रहा। यह लंबा है, लेकिन मैं केवल -j1 – Seb

+0

FYI का उपयोग करने की अनुशंसा करता हूं, यह Qt 5.4.1 में तय किया गया है। [QTBUG-40,449] (https://bugreports.qt.io/browse/QTBUG-40449) – Shinnok

2

पैच लागू करने के लिए, आप क्यूटी सूत्रों का कहना है डाउनलोड करने के लिए की आवश्यकता होगी और उसके बाद लाइनों का उपयोग कर fileId के बजाय filepath को पुनः प्राप्त करने के लिए आवश्यक जोड़ने (पूर्व Git का उपयोग करें।):

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

विधि। Patch Code

जब आप इस किया है, आप क्यूटी का निर्माण और यह समझौता संस्करण के साथ अपनी परियोजना का निर्माण परिवर्तन किए के उपयोग में लेने के लिए की जरूरत है:

यहाँ हिस्सा जहां यह जोड़ा जाना चाहिए है।

संबंधित मुद्दे