« せっかくだからDoxgenを勉強するぜ その1 | トップページ | Qt Brynhildr (仮称) for Android »

2014年6月24日 (火)

再起動のたびにウィンドウがズレます

気にはなっていたのですが、再起動のたびにウィンドウがズレます。

メインウィンドウは、左上の位置(x, y)とサイズ(高さ、幅)という情報で保存しています。

settings->getSettings()->setValue(QTB_GEOMETRY, geometry());

この記述は「入門Qt4プログラミング」からコピーしたものをそのまま使ってました。
関数geometry()はQMainWindowsクラスのメソッドです。QRectというクラスを返してくれます。

で、この保存した情報を復帰する記述が以下です。

// restore geometry
QRect rect = settings->getSettings()->value(QTB_GEOMETRY,
QRect(200, 200, 800, 600)).toRect();
move(rect.topLeft());
resize(rect.size());

move()で位置を指定し、resize()でサイズを再設定します。ところが、この記述だと、起動のたびにどんどん下に移動していきます。かなり気持ち悪いです。

おかしいなぁと思い、Qt AssistantでQMainWindowを眺めていると、geometry()という関数以外に

frameGeometry()

というよく似た関数が存在することに気づきました。なんか怪しいので、frameGeometry()のところを見ると"Window Geometry"というリンクが張ってありました。これをクリック。

frameGeometry()はどうやら、Window Titleといったフレーム部分を含んだ形で位置、サイズ情報を返すようです。一方geometry()はフレーム部分を含まないウィンドウの位置、サイズ情報を返すようです。

再生時に使うmove(), resize()にはどの情報を使えばよいのでしょうか…これもQMainWindowのドキュメントで確認します。

結局move()で使う位置情報はフレーム込みの位置情報、サイズはフレームを含まないウィンドウのサイズということが分かりました。単純にgeometry()で帰ってくる位置、サイズ情報を保存してはタメだということのようです。

// save geometry
QRect geometryInfo(QPoint(frameGeometry().x(), frameGeometry().y()),
             QSize(geometry().width(), geometry().height()));
settings->getSettings()->setValue(QTB_GEOMETRY, geometryInfo);

とすればよいようです。何事もコピペではダメだということですね…

(追記)

Windowsだと上記で大丈夫そうですが、Ubuntuだとまだズレます。位置情報のx,yにそれぞれ10足した情報をUbuntuの場合だけ保存する必要がありそうです。うーん…

« せっかくだからDoxgenを勉強するぜ その1 | トップページ | Qt Brynhildr (仮称) for Android »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 再起動のたびにウィンドウがズレます:

« せっかくだからDoxgenを勉強するぜ その1 | トップページ | Qt Brynhildr (仮称) for Android »