2015-05-13 2 views
5

में कार्य पट्टी के राइट-क्लिक मेनू में 'विंडो बंद' करने के लिए प्रतिक्रिया करने के लिए क्यूटी 5.3.0 और Windows 8.1 का उपयोग करना:कैसे विंडोज

अगर मैंने कुछ याद कर रहा हूँ या पता नहीं है अगर यह एक निरीक्षण है क्यूटी में, लेकिन जब मेरे पास बस एक QMainWindow है जो QDialog (exec() के साथ) खोलता है और फिर Windows टास्क बार आइकन के राइट-क्लिक मेनू के 'विंडो बंद करें' फ़ंक्शन का उपयोग करने का प्रयास करता है (जबकि संवाद अभी भी खुला है), आवेदन अपेक्षित के रूप में बंद नहीं है, लेकिन कुछ भी नहीं होता है। मुझे QDialog या QMainWindow में क्लोजएवेंट भी नहीं मिलता है।

जब केवल QMainWindow खुला है, तो एप्लिकेशन सफलतापूर्वक बंद हो जाता है और मुझे एक करीबी इवेंट भी मिल रहा है।

यह वास्तव में भी पुन: उत्पन्न होता है जब उदा। क्यूटी डिजाइनर का उपयोग करके और एक अतिरिक्त संवाद खोलना और फिर 'विंडो बंद करें' फ़ंक्शन का उपयोग करने का प्रयास करना।

कोई विचार इस व्यवहार को ठीक करने के लिए कैसे करें?

उत्तर

5

जो व्यवहार आप देख रहे हैं वह वास्तव में आश्चर्यजनक नहीं है। वास्तव में, यह वास्तव में एक (ज्यादातर) अच्छी तरह से व्यवहार किए गए विंडोज ऐप जैसे नोटपैड के साथ होता है, इसलिए मुझे यकीन नहीं है कि मैं इसे एक बग भी कहूंगा।

ओपन नोटपैड खोलें, और सहायता-> एक मोडल संवाद प्राप्त करने के बारे में चुनें। अब टास्क बार आइकन से बंद करें चुनें। कुछ नहीं हुआ।

टास्क बार से बंद मुख्य विंडो पर भेजा गया है जैसे कि उपयोगकर्ता ने "सिस्टम" मेनू से बंद विकल्प चुना था। यह SC_CLOSE के साथ WM_SYSCOMMAND के रूप में आता है। यदि आप इसे स्पष्ट रूप से संभाल नहीं पाते हैं, तो DefWindowProc इसे WM_CLOSE संदेश में बदल देता है, जो कि अधिकांश मुख्य विंडो हैंडल करता है।

लेकिन यदि आपके पास एक मोडल संवाद खुला है, तो मुख्य विंडो अक्षम है और इस प्रकार संदेश नहीं मिलता है।

इसे ठीक करने का एक तरीका मोडल संवाद नहीं होना चाहिए और इसके बजाय मॉडेलिस संवाद के साथ समानता अनुकरण करना होगा। इससे मुख्य विंडो को संदेश प्राप्त करने और प्रतिक्रिया देने की अनुमति मिल जाएगी। लेकिन यह एक छोटे से फिक्स के लिए बहुत काम होगा।

+2

यह उपयोगिता परिप्रेक्ष्य से थोड़ा दुर्भाग्यपूर्ण है लेकिन आपकी व्याख्या को समझ में आता है और कम से कम मैं किसी भी शिकायत के मामले में मूल व्यवहार करने के लिए उंगली को इंगित कर सकता हूं :) – Robert

+0

सहमत हैं। जितना संभव हो सके मोडल संवाद से बचने का एक और कारण। –

2

यदि आप फोन के माध्यम से अपने QDialogQDialog::show() माता पिता के रूप MainWindow (QDialog *dialog = new QDialog(this)) जहां this अपने MainWindow सूचक है गुजर, यह काम करेंगे। हालांकि संवाद अब मोडल नहीं होगा। मुझे नहीं पता कि आपके मामले में औपचारिकता महत्वपूर्ण है या नहीं।