2012-07-04 13 views
5

मैं एक दृश्य और एक मॉडल लागू कर रहा हूं जहां मैं आंतरिक रूप से (खींचकर) दोनों आइटमों का समर्थन करना चाहता हूं, और आइटम कॉपी करना (खींचते समय Ctrl दबाकर)। मैंने निर्देशों के अनुसार मुझे जो कुछ करने की ज़रूरत है वह सब किया है। मैंने माइम फ़ंक्शंस सेट अप किया है, मैंने RemoveRows(), और झंडे() को कार्यान्वित किया है। समस्या तब होती है जब मैं खींचता हूं, यह एक प्रतिलिपि ऑपरेशन के लिए डिफ़ॉल्ट होता है (मुझे तीर कर्सर को प्लस साइन के साथ मिलता है, और यह वास्तव में मॉडल में एक नया बनाकर आइटम कॉपी करता है)।क्यूटी ड्रैग/ड्रॉप: प्रतिलिपि सक्षम होने पर स्थानांतरित नहीं हो सकता है (उबंटू जीनोम)

एकमात्र अंतर जो मैं देख सकता हूं वह यह है: यदि मैं समर्थित डॉपएक्शन() में केवल Qt :: MoveAction लौटाता हूं, तो यह केवल चलता है। अगर मैं लौटता हूं (क्यूटी :: CopyAction | Qt :: MoveAction), यह केवल प्रतियां।

कोई विचार? मैं इसे नॉटिलस (जीनोम) या विंडोज़ फ़ाइल एक्सप्लोरर में फ़ाइलों की तरह काम करना चाहता हूं: खींचें आइकन को चारों ओर ले जाएं, ctrl + drag उन्हें कॉपी करता है।

+0

विंडोज़ पर भी यही समस्या होती है, लेकिन 'Qt :: MoveAction' पसंदीदा विकल्प होने के साथ। –

+0

यदि कोई चाहें तो समस्या का प्रदर्शन करने के लिए मैं कुछ उदाहरण कोड पोस्ट कर सकता हूं। –

+0

चूंकि इसने अंत में मेरे प्रश्न का उत्तर नहीं दिया, जो महसूस करते हैं कि वे बक्षीस के लायक हैं? –

उत्तर

0

क्या हुआ अगर आप की जाँच pressEvent कि क्या Ctrl कुंजी दबाया जाता है इस तरह से पहले एक keyPressEvent लिख सकते हैं और सेट Ctrl कुंजी दबाया जाता है या नहीं, '

keyPressEvent(QKeyEvent *e) 
    { 
     if(e->key() == Qt::Key_Control) 
      bControlKeyPressed = true; 
    } 
    keyReleaseEvent (QKeyEvent *e) 
    { 
     if(e->key() == Qt::Key_Control) 
      bControlKeyPressed = false; 
    } 

और माउस में कोशिश

`mousePressEvent() 
{ 
    if (bControlKeyPressed) 
    //enable Qt::CopyAction 
else 
    //enable Qt::MoveAction 
}` 
+0

इस तरह के उत्तर के रूप में सरल होगा , लेकिन उबंटू/विंडोज सिर्फ निर्दिष्ट क्रिया (और डिफ़ॉल्ट कार्रवाई भी) को अनदेखा करता है। –

0

मैं यही करूंगा:

प्रतिलिपि कार्रवाई को सक्षम करें। फिर & ड्रॉप सिग्नल को सुनें या वर्चुअल विधियों को ओवरराइड करें (या जो भी क्यूटी ऑफ़र, मैंने जांच नहीं की है) और यदि आपके द्वारा की गई कार्रवाई को स्थानांतरित किया गया है, तो पंक्ति को "मैन्युअल" हटा दें। जब एक बूंद बनाई जाती है, तो आप जिस क्रिया को प्राथमिकता देते हैं उसे सहेजें।

यदि क्यूटी डेटा से वांछित कार्रवाई निर्धारित करने का कोई तरीका नहीं है, तो Ctrl कुंजी स्थिति जांचें और बूलियन को यह कहें कि यह कॉपी या स्थानांतरित है या नहीं। अब, जब क्यूटी संकेतों को कुछ गिरा दिया गया था, तो आपके द्वारा चुनी गई कार्रवाई की जांच करें, और स्वयं द्वारा स्थानांतरित पंक्ति को हटाएं।

+0

यह समाधान कुछ हद तक काम करता है, लेकिन इसमें दो समस्याएं हैं: ए) ड्रैग आइकन गलत है। बी) यदि कई वस्तुओं का चयन किया जाता है, तो उन्हें खींचकर कुछ को हटा दिया जाता है और दूसरों की प्रतिलिपि बनाते हैं। –

+0

फिर मैं आपके लिए दो विकल्प देखता हूं। 1) बस-से-छुटकारा पाने का दृष्टिकोण: मैन्युअल रूप से आइकन सेट करें। कई चयनों के लिए, अपने आप से ड्रॉप को संभालें। तय करें कि प्रत्येक नोड को कैसे स्थानांतरित/कॉपी करें। यह जटिल हो सकता है कि कैसे क्यूटी आपको ड्रैग और ड्रॉप डेटा तक पहुंचने देता है ... 2) गंभीर अभियंता दृष्टिकोण: पता लगाएं कि यह क्यों काम नहीं करता है। क्यूटी मुफ्त सॉफ्टवेयर है, इसलिए अगर कोई बग है, तो जांच करें कि क्या इसे हल किया जा सकता है या नहीं। इस प्रकार आप क्यूटी के सभी उपयोगकर्ताओं और क्यूटी के साथ लिखे गए किसी भी आवेदन में योगदान देते हैं। और किसी भी कामकाज की आवश्यकता नहीं होगी। – cfa45ca55111016ee9269f0a52e771

+0

यदि विंडोज इंटर्नल्स में कोई समस्या है, तो आप उन्हें सबसे अच्छा कर सकते हैं उन्हें एक ई-मेल भेजें। विंडोज मालिकाना सॉफ़्टवेयर है इसलिए मैं इसे अपनी समस्या के रूप में मानता हूं, न कि मेरा या तुम्हारा, अगर डी एंड डी ऐसा काम नहीं करता है। या अपने कोड में अस्थायी वर्कअराउंड जोड़ें, केवल विंडोज – cfa45ca55111016ee9269f0a52e771

1

(मैं व्यक्तिगत रूप से gtkmm, जहां pefectly कॉपी-अगर-Ctrl-है दबाया काम करता है का उपयोग करें) मैं माफी चाहता जब मैंने पाया मैं गलत क्या कर रहा था कि मैं इस प्रश्न का उत्तर देकर ऊपर का पालन नहीं किया है। कोड है कि मुझे गड़बड़ अप QAbstractItemView::startDrag() में था:

if (d->defaultDropAction != Qt::IgnoreAction && (supportedActions & d->defaultDropAction)) 
     defaultDropAction = d->defaultDropAction; 
    else if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove) 
     defaultDropAction = Qt::CopyAction; 

समस्या आई) setDefaultDropAction(Qt::MoveAction); इसलिए startDrag (के रूप में विजेट पर defaultDropAction संपत्ति की स्थापना नहीं की गई थी CopyAction को दोषी किया गया है। यदि डिफ़ॉल्ट DropAction Qt :: MoveAction है, तो आप एक प्रतिलिपि कार्रवाई में एक ड्रैग को प्रगति पर स्विच करने के लिए कीबोर्ड Ctrl का उपयोग कर सकते हैं, जो मेरा वांछित व्यवहार है।

मुझे क्यूटी पसंद है, लेकिन निश्चित रूप से ड्रैग/ड्रॉप से ​​संबंधित बहुत भ्रमित और कुछ हद तक अंतर्निहित गुण हैं। गुणों का सही संयोजन नहीं करना आसान है।

निष्कर्ष: किसी क्यूटी :: MoveAction को defaultDropAction तैयार करना न भूलें।

+0

के लिए बस थोड़ा और जानकारी देने के लिए, सूची में मुझे जो गुण बदलना था, वे इस प्रकार हैं: स्वीकृति ड्रॉप्स: सत्य, ड्रैगएनेबल: सत्य, डिफ़ॉल्ट डॉपएक्शन: मूवएक्शन (यह बड़ा था एक!), चयन मोड: विस्तारित चयन (एक अपेक्षित विंडोज एक्सप्लोरर व्यवहार भी है लेकिन QListView के लिए डिफ़ॉल्ट नहीं है)। मॉडल में भी: setSupportedDragActions (Qt :: CopyAction | Qt :: MoveAction) ;, वापसी Qt :: CopyAction | Qt :: MyModel में MoveAction :: मॉडल :: समर्थित DropActions(), Qt :: ItemIsDrag को MyModel :: flags() में सक्षम करें, MyModel :: mimeTypes(), mimeData(), और dropMimeData को लागू करें। उम्मीद है की वो मदद करदे! – Scott

+0

इसका मतलब है कि मैं जिस बग का अनुभव कर रहा हूं वह वास्तव में आपके द्वारा अनुभव किए गए से अलग है। यह विंडोज पर एक क्यूटी बग की तरह लग रहा है। –

+0

डी के, मैं उत्सुक हूं - क्या यह एक क्यूटी एसडीके (निर्माता) है जो आमतौर पर * मिंगव आधारित होता है, या यह विजुअल स्टूडियो (जो WinAPI आधारित है) के साथ संकलित क्यूटी है? साथ ही, मेरी समस्या डिफ़ॉल्ट प्रतिलिपि के रूप में प्रतिलिपि के साथ थी, मैं मूव को बिल्कुल प्राप्त नहीं कर सका, क्योंकि प्रतिलिपि को स्थानांतरित करने के लिए कोई कीबोर्ड संशोधक नहीं है। आप कहते हैं कि आपको मूव के साथ कोई समस्या है - तो क्या आप Ctrl दबा नहीं सकते और इसे प्रतिलिपि में बदल सकते हैं? – Scott

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