2010-06-10 8 views
10

में यह एक बहुत ही सरल सवाल की तरह लग सकता है, लेकिन मैं कुछ डेटा जब भी QMainWindow बंद कर देता है डंप करना चाहते हैं, तो मैं कोड का निम्न भाग का प्रयोग किया:क्यूटी QMainWindow बंद

QObject::connect(MainWindow.centralwidget, SIGNAL(destroyed()), this, SLOT(close())); 

लेकिन यह प्रतीत नहीं होता इसे close() पर कॉल करने के लिए। क्या मैं यह गलत कर रहा हूँ?
क्या केंद्रीयविड्थ नष्ट होने का अनुमान नहीं है?

या शायद close() से पहले एप्लिकेशन बंद हो सकता है?

तब ऐसा करने के किसी भी अन्य तरीके?

+0

यह 'आपके' QObject' पदानुक्रम के भीतर कहां फिट है? ऐसा हो सकता है कि सिग्नल भेजे जाने से पहले इसे हटा दिया जा रहा है। निस्संदेह मैं इसके बारे में ज्यादा चिंता नहीं करता क्योंकि अब तक दिए गए उत्तरों में बेहतर विकल्प हैं। – Troubadour

+0

आप जो कोड दिखाए गए कोड के साथ डेटा डंप नहीं कर सकते हैं ... क्या यह भी सवाल है कि QMainWindow बंद होने से पहले डेटा को डंप करने का तरीका है या नहीं? या क्यों QMainwindow बंद नहीं हो रहा है? इसे स्पष्ट करें ... – liaK

+1

मैं मुख्य विंडो को बंद करने के लिए 'x' पर क्लिक करने के बाद लिखना और एक्सएमएल फ़ाइल लिखना चाहता हूं। यह उपरोक्त कोड या QApplication :: lastWindowClosed() (या QApplication :: aboutToQuit() के लिए कोड के साथ काम नहीं करता है) ... हैवेन्ट ने QCloseEvent की कोशिश की, लेकिन एमवीसी संरचना को रखने के लिए, मैं नहीं। जिस कक्षा में मैं काम कर रहा हूं वह QMainWindow नहीं है, बल्कि मैं डिजाइनर में बनाई गई UI फ़ाइलों को संकलित करके प्राप्त फ़ाइलों का उपयोग करता हूं। – Cenoc

उत्तर

10

मैं इसके बजाय आज़माउंगा।

+0

काम नहीं किया, इसका मतलब यह होगा कि उस सिग्नल को स्वीकार करने से पहले इसे नष्ट किया जा रहा है? लेकिन यह अजीब बात है क्योंकि वर्ग का विनाशक कुछ भी आउटपुट नहीं कर रहा है (std :: cerr के माध्यम से) – Cenoc

+0

सुनिश्चित करें कि स्लॉट वाला ऑब्जेक्ट QMainWindow का बच्चा नहीं है। QWidgets नीचे जाने पर अपने सभी बच्चों को नष्ट कर देते हैं। –

+0

@Cenoc: अपना 'मुख्य' फ़ंक्शन पोस्ट करें, यह क्या हो रहा है इसे साफ़ करने में सहायता कर सकता है। –

4

क्या आप फ़ंक्शन को अपने QMainWindow के लिए कार्यान्वित कर सकते हैं और अपना कोड वहां डाल सकते हैं?

1

आपका प्रारंभिक प्रश्न और कोड मेल नहीं खाता है। यदि आप QMainWindow पर कुछ करना चाहते हैं तो या तो एक उप-वर्ग बनाएं और closeEvent पुन: कार्यान्वित करें या MainWindow::destroyed() से कनेक्ट करें। हालांकि नोट के लिए तीसरा पैराग्राफ देखें।

लेकिन आपका कोड दिखा रहा है कि MainWindow के बच्चे को close() नामक कुछ स्लॉट में नष्ट किया जा रहा है जो एक तीसरी कक्षा प्रतीत होता है। centralwidget नष्ट हो जाएगा MainWindow पहले से ही नष्ट हो गया है, इसलिए यह संभवतः आपकी मदद नहीं करेगा।

इसके अलावा, यह इस बात पर निर्भर करता है कि आपने मेनविंडो (ढेर या ढेर) कैसे बनाया और यदि आप इसे ठीक से नष्ट कर रहे हैं। आदर्श रूप में, आपको QMainWindow का उप-वर्ग बनाना चाहिए (यदि आपने उस डिजाइनर का उपयोग किया है जो आपके पास पहले से है)।

22

बेहतर होगा कि तुम फिर से इस तरह अपने मुख्य MainWindow कक्षा में एक आभासी समारोह को लागू:

class MainWindow : public QMainWindow { 

    Q_OBJECT; 

public: 
    MainWindow(); 

protected: 
    void closeEvent(QCloseEvent *event); 
} 

और उसके बाद स्रोत फ़ाइल में घोषित:

void MainWindow::closeEvent(QCloseEvent *event) { 
    // do some data saves or something else 
} 

गुड लक।

+2

ओवरराइड को पूरा करना एक अच्छा विचार है। आईई: closeEvent() कॉल QMainWindow :: closeEvent (घटना); समारोह के अंत में। SaveState() फ़ंक्शन के लिए प्रलेखन में उदाहरण देखें: http://doc.qt.io/qt-4.8/qmainwindow.html – Ph0t0n

+0

जबकि Ph0t0n आवश्यक रूप से गलत नहीं है, असली दुनिया 'closeEvent() 'कार्यान्वयन आम तौर पर सहेजे गए परिवर्तन मौजूद हैं या नहीं, इस पर निर्भर करते हुए 'event.accept() 'या' event.ignore() 'पर कॉल करें। 'QMainWindow :: closeEvent (event)' आमतौर पर * नहीं * कहा जाता है। अभी तक एक और उपयोगी उदाहरण के लिए ['closeEvent()' दस्तावेज़] (http://doc.qt.io/archives/qt-4.8/qwidget.html#closeEvent) देखें। –

-1

डंप कोड को अपने मुख्य विंडोज़ विनाशक में जोड़ने के बारे में कैसे?

+0

कोशिश की, यह उत्पादन नहीं करता .... विषम? – Cenoc

+0

आप नष्ट हो गए या मेनविंडो के विनाशक में I/O तक नहीं पहुंच सकते - आप अंत में अपने अनुप्रयोग विनाशक में हैं और सबकुछ नष्ट हो गया है। इसके बजाय closeEvent() का उपयोग करें। – Jens

1

अपनी कक्षा में QMainWindow::closeEvent(QCloseEvent *) लागू करें। फिर closing() नामक एक नए सिग्नल को कार्यान्वित करें और QMainWindow::closeEvent() के कार्यान्वयन से इसे हटा दें। फिर आप खिड़की बंद होने से ठीक पहले कुछ करने के लिए उस सिग्नल से कनेक्ट कर सकते हैं। आप closeEvent का उपयोग सीधे करने के लिए कर सकते हैं जो आपको करना है, जैसे राज्य को सहेजना, डेटा सिंक करना या जो भी हो।

1

enter image description here अजगर में (PyQt4 या pyqt5) आपको बस इतना करना होगा निम्नलिखित:

class MyWindow(QMainWindow): 
    def __init__(self): 
     super(MyWindow, self).__init__() 
     # 
     # My initializations... 
     # 

    '''''' 

    def closeEvent(self, *args, **kwargs): 
     # 
     # Stuff I want to do when this 
     # just before (!) this window gets closed... 
     # 

    '''''' 

यह पता चला है कि closeEvent (..) में सामान समारोह सिर्फ निष्पादित हो जाता है दिलचस्प है   से पहले खिड़की बंद हो जाती है।

<myProj.MyWindow object at 0x000001D3C3B3AAF8> 
True 

<myProj.MyWindow object at 0x000001D3C3B3AAF8> 
False 

यह साबित होता है कि खिड़की अभी भी जब closeEvent में प्रवेश दिखाई दे रही थी (..) समारोह:

# Test if the closeEvent(..) function 
    # executes just before or just after the window closes. 
    def closeEvent(self, *args, **kwargs): 
     # 'self' is the QMainWindow-object. 
     print(self) 
     print(self.isVisible()) 

     # Print out the same stuff 2 seconds from now. 
     QTimer.singleShot(2000, lambda: print(self)) 
     QTimer.singleShot(2100, lambda: print(self.isVisible())) 

    '''''' 

यह आपके टर्मिनल में उत्पादन होता है: आप निम्नलिखित परीक्षण के साथ इस की पुष्टि कर सकते , लेकिन उस समारोह से बाहर निकलने के बाद नहीं।

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