2014-04-24 3 views
5

ओएस एक्स 10.9 क्यूटी 5.2 के साथ और निम्नलिखित आवेदन कोड परक्यूटी MainWindow CloseEvent Mac पर Cmd + क्यू

#include "mywindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) { 
    QApplication a(argc, argv); 
    MyWindow w(); 
    w.show(); 
    return a.exec(); } 

जहां MyWindowQMainWindow से निकला है और closeEvent(QCloseEvent*) विधि अधिलेखित कर देता है, जब मैं आवेदन विंडो को बंद इस विधि कहा जाता है (उदाहरण के लिए विंडो (एक्स) बंद बटन पर क्लिक करें), लेकिन जब मैं मुख्य मेनू -> "छोड़ें" या "सीएमडी + क्यू" कुंजी शॉर्टकट के माध्यम से एप्लिकेशन को बंद करता हूं तो इसे लागू नहीं किया जाता है।

वेब और कई प्रश्नों को देखने से मुझे यह धारणा मिली कि एप्लिकेशन को बंद करने से सभी शीर्ष स्तर की विंडो के लिए क्लोजएवेंट का आह्वान करना चाहिए। क्या यह मामला नहीं है, या यहां कुछ गलत हो रहा है?

संपादित करें: आवेदन को बंद करने के ऊपर तरीके के अलावा, वहाँ किसी भी अन्य उदाहरण है कि मैं सामान्य रूप में खिड़की के close घटना लागू बजाय संभाल चाहिए कि QApplication::quit में परिणाम होगा रहे हैं? उदाहरण के लिए सिस्टम शटडाउन के बारे में क्या?

close ईवेंट को संभालने के दौरान, मैं पुष्टि कर रहा हूं कि उपयोगकर्ता वास्तव में बाहर निकलना चाहता है और मैं सुनिश्चित करता हूं कि वापस लिखने की तरह सफाई की गई सेटिंग्स बदल रही हैं। क्या मुझे इसके बजाय विनाशक को क्लीनअप/बचत सेटिंग्स को स्थानांतरित करना चाहिए और closeEvent में पुष्टिकरण क्वेरी करना चाहिए?

उत्तर

8

मैक पर डिफ़ॉल्ट रूप से, Qt will create an Apple Menu | Quit if a menubar doesn't exist with either quit or exit entry। वह डिफ़ॉल्ट निर्मित प्रविष्टि QApplication::quit() पर कॉल करेगी जो आपके MyWindow::closeEvent() को ट्रिगर नहीं करेगी।

अपने यूआई में आप (Mac पर यह पूर्ण रूप से अपने से बाहर निकलें करने के लिए बदल दिया जाएगा) एक मेनू आइटम से बाहर निकलें नामित जोड़ना चाहिए और MyWindow वर्ग निर्माता में आप close() स्लॉट (जो QWidget से प्राप्त होती है) करने के लिए है कि कार्रवाई कनेक्ट होना चाहिए।

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

+0

इस त्वरित और सही प्रतिक्रिया के लिए धन्यवाद, प्रारंभिक प्रश्न का पूरी तरह से जवाब दे रहा है। मैंने अपना प्रश्न थोड़ा और सामान्य होने के लिए संपादित किया, शायद आप टिप्पणी कर सकते हैं। –