2008-09-16 12 views
20

私はQtアプリケーションにQMainWindowを持っています。私はそれを閉じて現在の復元サイズ(最大化されていないときのウィンドウのサイズ)を保存します。これは、復元モードでウィンドウを閉じる(つまり、最大化しない)ときにうまく機能します。しかし、最大化するとウィンドウを閉じると、次にアプリケーションを起動してアプリケーションを復元すると(最大化モードで起動するため)、復元する必要があるサイズは記憶されません。これを行う方法はありますか?Qtのセッション間にウィンドウサイズを保存するにはどうすればよいですか?

答えて

17

QWidget::saveGeometry機能を使用すると、現在の設定をレジストリに書き込むことができます(レジストリにはQSettingsを使用してアクセスします)。その後、起動時にrestoreGeometry()を使用して前の状態に戻ります。

+2

QWidget :: saveState() – mtbkrdave

+1

残念ながら、2番目のモニタに最大化されたウィンドウがある場合は、この方法では機能しません少なくともWindows 7では)。復元後のジオメトリは、最初のモニタでウィンドウを最大化します。私はこれを解決するためにiforce2dの答えに似たアプローチを使用します。 –

+0

注: 'QWidget :: saveState()'はこれ以上ありません。少なくとも、それはQt 4.8または5.7にはありません。 'saveState()'は 'QMainWindow'にのみ存在するようです。 – Len

4

この問題も発生しました。

できること:ウィンドウのサイズに加えて、最大化の有無を保存します(QWidget::isMaximized())。

次にアプリケーションを起動するときは、最初にサイズ(QWidget::resize())を設定し、必要に応じて最大化してください(QWidget::showMaximized())。復元時には正しいサイズに戻ってください。

+0

は私のために関係なく正常に動作します。質問は5歳なので、Qtアップデートのためだと思います。 –

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

素晴らしい答え - このコードはMac OSXの魅力のように機能します!:-)いくつかの設定を行うと、多くの場所から設定にアクセスする際にコードの重複がなくなります。http://developer.qt.nokia.com/doc/qt-4.8/qsettings.html#basic-usage – ssc

+0

それは正解ですが、魅力的に動作するサンプルコードが見つかるまで、あまりにも多くの時間を費やしていました。 :) – 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() 
関連する問題