2013-10-05 12 views
6

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

उत्तर

7

आप क्यूटी घटना पाश का उपयोग कर रहे हैं, तो आप निम्नलिखित संकेत पकड़ कर सकते हैं:

शून्य QCoreApplication :: aboutToQuit() [संकेत]

जब आवेदन करने के लिए के बारे में है यह संकेत उत्सर्जित होता है मुख्य घटना पाश छोड़ दें, उदाहरण के लिए जब घटना लूप स्तर शून्य पर गिर जाता है। यह एप्लिकेशन के अंदर से छोड़ने के लिए कॉल के बाद या जब उपयोगकर्ता पूरे डेस्कटॉप सत्र को बंद कर देता है तो हो सकता है। सिग्नल विशेष रूप से उपयोगी होता है यदि आपके एप्लिकेशन को कुछ अंतिम-दूसरे क्लीनअप करना है। ध्यान दें कि इस राज्य में कोई उपयोगकर्ता इंटरैक्शन संभव नहीं है।

उसके अलावा, आपको निम्न संदेश खोजे जा रहे नीचे अगर ऊपर उल्लिखित संकेत आपके उपयोग के मामले के लिए उपयुक्त नहीं है:

WM_QUIT: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632641(v=vs.85).aspx

WM_CLOSE: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx

WM_QUERYENDSESSION : http://msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx

WM_END सत्र: http://msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx

0

मुझे क्यूटी नहीं पता। यदि आप विंडोज़ होने के लिए केवल WM_QUERYENDSESSION और WM_ENDSESSION संदेश कर सकते हैं तो यह सही काम हो सकता है।

2

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

इनमें से बहुत कुछ आपके लिए QSettings द्वारा संभाला जाता है। जब तक आप QSettings का उपयोग करते हैं, तो आपको उचित व्यवहार मिल जाएगा। यदि आप स्वयं फ़ाइलों को सहेज रहे हैं, तो QSaveFile का उपयोग करें क्योंकि यह फ़ाइल को फ्लश करने और परमाणु फ़ाइल प्रतिस्थापन का अनुमान लगाने के साथ संबंधित है, ताकि अगर आप लिखने के बीच में मार (मजबूर समाप्ति) आते हैं तो आप सेटिंग खो देंगे नहीं।

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

आप QAbstractNativeEventFilter इंस्टॉल करके और WM_ENDSESSION और WM_QUERYENDSESSION को प्रोसेस करके लॉगऑफ/शटडाउन प्रक्रिया में भी भाग ले सकते हैं। यह केवल तभी समझ में आता है जब आप समय से पहले जानना चाहते हैं कि एप्लिकेशन छोड़ दिया जाएगा।जब तक आप शटडाउन/लॉगऑफ को स्पष्ट रूप से बंद नहीं करना चाहते हैं, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

+0

मैं abouttoQuit SIGHUP और SIGINT के बारे में लिनक्स पर sigterm, लेकिन क्या, SIGHUP आमतौर पर लिनक्स में लॉग आउट करने पर आवेदन करने के लिए भेज दिया जाता है संभालती है पता नहीं था, यही वजह है कि मैं संकेत संचालकों का प्रयोग किया:

यहाँ कुछ संबंधित विचार-विमर्श कर रहे हैं (क्यूटी रास्ता मंच विशिष्ट) लिनक्स –

+0

पर सवाल के बारे में कुछ भी नहीं कहता है कि आवेदन जबरन समाप्त हो रहा है। यह 'सिगरम' का उल्लेख करता है जो एक शानदार शट डाउन सिग्नल है, न कि 'सिगिल'। – qris

1

मैं इसे aboutToQuit के बजाय (Qt5 में या QGuiApplication::commitDataRequest) QApplication::commitDataRequest संकेत को संभालने के लिए बेहतर हो सकता है लगता है। सेटिंग्स को सहेजने के लिए सिग्नल को अपने फ़ंक्शन से कनेक्ट करें। http://qt-project.org/forums/viewthread/33329