2011-01-07 9 views
11

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

क्या दोनों के बीच अंतर करने के लिए एक अनुशंसित तरीका/सर्वोत्तम अभ्यास है? जब मैं वास्तव में डबल क्लिक करता हूं तो मैं एकल क्लिक एक्शन नहीं करना चाहता हूं।

मैं क्यूटी 4.6

उपयोग कर रहा हूँ

उत्तर

6

आप QtCentre मंच पर Double Click Capturing शीर्षक सूत्र में उत्तर मिल सकता है;

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

wysota

+0

यह काम करता है, लेकिन निश्चित रूप से यह एकल-क्लिक करते समय उपयोगकर्ता अनुभव में देरी बनाता है। सिंगल-क्लिक पर जो भी होना चाहिए, वह "लंबा" समय (QApplication :: doubleClickInterval()) लेगा, इसलिए एप्लिकेशन धीमा लगता है। बिल के जवाब के अलावा, मैं बेहतर समाधान के बारे में सोच नहीं सकता हूं। –

9

यह सुनिश्चित करें कि आपके एकल क्लिक और डबल क्लिक के धारणात्मक संबंधित हैं बनाने के लिए एक अच्छा यूआई डिजाइन है:

Single-Click: select icon 
Double-Click: select icon and open it 

Single-Click: select color 
Double-Click: select color and open palette editor 

सूचना कैसे इन उदाहरणों में कार्रवाई एकल क्लिक करें वास्तव में डबल-क्लिक का सबसेट है। यह आपको आगे बढ़ें और अपने एकल क्लिक कार्रवाई सामान्य रूप से करते हैं और बस डबल क्लिक में आता है, तो अतिरिक्त कार्रवाई कर सकते हैं इसका मतलब है

अपने यूजर इंटरफेस है, तो कुछ इस तरह:।

Single-Click: select icon 
Double-Click: close window 

तो फिर तुम कर रहे हैं अपने उपयोगकर्ताओं को असफल होने के लिए सेट अप करें। यहां तक ​​कि अगर उन्हें याद है कि सिंगल-क्लिकिंग हर समय डबल-क्लिक करने के विरुद्ध क्या करती है, तो डबल-क्लिक करने या बहुत लंबे समय तक प्रतीक्षा करने के दौरान गलती से अपने माउस को बहुत आसानी से ले जाना बहुत आसान होता है।

संपादित करें:

मुझे यह सुनकर खेद है।

+2

यह एक अच्छा मुद्दा है, लेकिन दुर्भाग्य से, मेरा निर्णय लेने का फैसला नहीं। –

+1

@ बिल: मैं असहमत हूं, मेरा मानना ​​है कि वैध यूआई डिज़ाइन हैं जहां आपको दो क्लिकों को अलग करने की आवश्यकता है। उदा। <एकल-क्लिक>: ऑडियो प्लेयर को रोकें, चयनित आइटम पर जानकारी दिखाएं। <डबल-क्लिक>: एकल-क्लिक के समान: प्लस चयनित आइटम चलाएं। यदि आप उन्हें अलग नहीं कर सकते हैं, तो दोनों को निकाल दिया जाता है, और यदि डबल-क्लिक के बाद सिंगल-क्लिक निष्पादित किया जाता है, तो ऑडियो प्लेयर बंद कर दिया जाएगा। – e1i45

+1

@ e1i45: क्या आपने सिंगल-क्लिक से पहले आने वाले डबल-क्लिक ईवेंट को देखा है? यह बहुत ही असंभव लगता है, क्योंकि ओएस एकल-क्लिक को वितरित करने के बाद तक डबल-क्लिक कार्रवाई नहीं कर पाएगा। – Bill

0

PySide जो अजगर क्यूटी 4.8 के बंधन मैंने देखा है का उपयोग करना है कि एक क्लिक के एक QEvent.MouseButtonPress देने:

उस मामले में, मैं इन दो लेख उपयोगी पाया घटना और डबल क्लिक एक QEvent.MouseButtonPress घटना को QEvent.MouseButtonDblClick के साथ बारीकी से वितरित करते हैं। विंडोज़ पर देरी लगभग 100ms है। इसका मतलब है कि आपको अभी भी एक समस्या है यदि आपको सिंगल और डबल क्लिक के बीच अंतर करने की आवश्यकता है।

समाधान को अंतर्निहित देरी (कुछ ओवरहेड जोड़ने) की तुलना में थोड़ा अधिक देरी के साथ QTimer की आवश्यकता है। यदि आप QEvent.MouseButtonPress ईवेंट देखते हैं तो आप अपना टाइमर शुरू करते हैं, टाइमआउट के मामले में यह एक क्लिक होता है। QEvent.MouseButtonDblClick के मामले में यह एक डबल क्लिक है और आप टाइमर को सिंगल क्लिक के रूप में गिनने से बचने के लिए रोकते हैं।