2008-09-16 13 views
20

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

उत्तर

17

रजिस्ट्री में वर्तमान सेटिंग्स को लिखने के लिए QWidget::saveGeometry सुविधा का उपयोग करें। (रजिस्ट्री को QSettings का उपयोग करके एक्सेस किया जाता है)। फिर पिछली स्थिति पर वापस जाने के लिए स्टार्टअप पर पुनर्स्थापना ज्यामिति() का उपयोग करें।

+2

यदि आप डॉकविड्ज की स्थिति और स्थिति को भी सहेजना चाहते हैं, न केवल आकार के लिए, आपको QWidget :: saveState() – mtbkrdave

+1

दुर्भाग्यवश, इस तरह से किसी ऐसे मामले के लिए काम नहीं करना चाहिए जब आपके पास दूसरी मॉनिटर पर अधिकतम विंडो हो (कम से कम विंडोज 7 में)। पुनर्स्थापना के बाद ज्यामिति पहली मॉनीटर पर विंडो को अधिकतम करता है। मैं इसे हल करने के लिए iforce2d के उत्तर के समान दृष्टिकोण का उपयोग करता हूं। –

+0

नोट: कोई भी 'QWidget :: saveState() 'कोई और नहीं है। कम से कम, यह क्यूटी 4.8 या 5.7 में नहीं है। 'saveState()' केवल 'QMainWindow' पर मौजूद प्रतीत होता है। – Len

4

मुझे इस समस्या का भी सामना करना पड़ा है।

आप क्या कर सकते हैं: विंडो के आकार के अलावा, इसे अधिकतम करें या नहीं (QWidget::isMaximized()) बचाएं।

अगली बार जब आप एप्लिकेशन शुरू करते हैं, तो पहले आकार (QWidget::resize()) सेट करें और फिर उपयुक्त होने पर इसे अधिकतम करें (QWidget::showMaximized())। जब इसे बहाल किया जाता है, तो इसे सही आकार में वापस जाना चाहिए।

+0

वर्क्स ठीक मेरे लिए कोई फर्क नहीं पड़ता। चूंकि प्रश्न 5 साल का है, मुझे लगता है कि यह क्यूटी अपडेट की वजह से है। –

17

मुझे पता चला कि यहां पिछले सभी उत्तरों का संयोजन Fedora 14 पर आवश्यक था। को आकार और स्थिति को बचाने के लिए विंडो को अधिकतम करने के लिए सावधान रहें!

void MainWindow::writePositionSettings() 
{ 
    QSettings qsettings("iforce2d", "killerapp"); 

    qsettings.beginGroup("mainwindow"); 

    qsettings.setValue("geometry", saveGeometry()); 
    qsettings.setValue("savestate", saveState()); 
    qsettings.setValue("maximized", isMaximized()); 
    if (!isMaximized()) { 
     qsettings.setValue("pos", pos()); 
     qsettings.setValue("size", size()); 
    } 

    qsettings.endGroup(); 
} 

void MainWindow::readPositionSettings() 
{ 
    QSettings qsettings("iforce2d", "killerapp"); 

    qsettings.beginGroup("mainwindow"); 

    restoreGeometry(qsettings.value("geometry", saveGeometry()).toByteArray()); 
    restoreState(qsettings.value("savestate", saveState()).toByteArray()); 
    move(qsettings.value("pos", pos()).toPoint()); 
    resize(qsettings.value("size", size()).toSize()); 
    if (qsettings.value("maximized", isMaximized()).toBool()) 
     showMaximized(); 

    qsettings.endGroup(); 
} 

मुख्य() में, स्थिति सेटिंग विंडो पहली बार दिखाने से पहले पढ़ रहे हैं ...

MainWindow mainWindow; 
mainWindow.readPositionSettings(); 
mainWindow.show(); 

... और इन ईवेंट हैंडलर्स सेटिंग को अपडेट के रूप में आवश्यक। (यह सेटिंग में होने वाले राईट ले जाने के दौरान हर माउस आंदोलन के लिए फ़ाइल और आकार बदलने के जो आदर्श नहीं है का कारण बनता है।)

void MainWindow::moveEvent(QMoveEvent*) 
{ 
    writePositionSettings(); 
} 

void MainWindow::resizeEvent(QResizeEvent*) 
{ 
    writePositionSettings(); 
} 

void MainWindow::closeEvent(QCloseEvent*) 
{ 
    writePositionSettings(); 
} 

फिर भी, स्थिति के ऊर्ध्वाधर घटक बहुत सही नहीं है, यह अनदेखी किया जा रहा है विंडो शीर्षक बार की ऊंचाई ... किसी को भी है कि के साथ सौदा करने के लिए कैसे मुझे पता है :)

+0

अच्छा उत्तर - यह कोड मैक ओएसएक्स पर एक आकर्षण की तरह काम करता है!:-) कुछ जगहों पर सेटिंग्स को एक्सेस करते समय सामने की कुछ सेटिंग्स को कोड डुप्लिकेशंस हटाते हैं, http://developer.qt.nokia.com/doc/qt-4.8/qsettings.html#basic-usage – ssc

+0

देखें I यह सही है लेकिन उस पर इतना समय बिताए बिना परेशान नहीं किया, जब तक कि मुझे आपका नमूना कोड नहीं मिला जो एक आकर्षण की तरह काम करता है। :) – Devolus

0

छवि http://qt-project.org/doc/qt-4.8/application-windows.html शो में जाने, कि geometry.x() और geometry.y() बराबर नहीं x() और y() है, जो pos() रूप में एक ही कर रहे हैं जानता है ।

मेरे मामले में, मैं का उपयोग करें:

x() 
y() 
width() 
height() 

और इन सफलतापूर्वक के साथ बहाल: यदि अधिकतम या नहीं

move() 
resize() 
संबंधित मुद्दे