再起動のたびにウィンドウがズレます
気にはなっていたのですが、再起動のたびにウィンドウがズレます。
メインウィンドウは、左上の位置(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 »
コメント