PySide を使って Linux/Windows で動作するアプリケーションを作成しています。最近、QMainWindow の “geometry” プロパティの挙動が Linux と Windows とでは異なるためにいろいろと戸惑ったので、実際に調べてみました。
はじめに
私がやりたかったのは、
メインウインドウを最大化、最小化、フルスクリーン化した後、ウインドウの現在のサイズをコード上で知る
という事です。QWidget.showMaximized/Minimized/FullScreen メソッドを実行することで、表示されるウインドウサイズを変化させる事はできます。(リファレンスでは、showFullScreen() は X Window ではうまく動かない可能性がある旨記述がありますが、私の利用範囲では今のところ不都合ありません。) しかし、以下で述べるように、コードから現在の表示サイズを知るのは、Windows ではうまくいきますが、Linux ではうまくいきませんでした。
調査方法
QMainWindow に対して、show, showMaximized, showMinimized, showFullScreen, showNormal, setGeometry の各メソッドを実行して、”geometry” プロパティがどのように変化するのか表示するプログラムを作成しました。
イベントループに入ってからメソッドを実行しないとウインドウが表示された状態の値を確認できないため、QTimer で 100msec の遅延を発生させてから実行しています。(ウインドウが表示されるため、実行時に多少画面がちらつきます。)
結果
1920×1080 のスクリーンサイズを持つ同一 PC (Windows をホスト、Linux をゲストとした VirtualBox 環境) にて、上記 checkShow.py を Windows7, Xubunutu13.04, Ubunutu13.04 で実行した結果を以下にあげます。各段階での “geometry” プロパティの値を一覧にしています。(実際の表示の冗長な部分は削って有ります。)
※QRect の値は、最初の2つのパラメータが位置(左上の座標)、次の2つが大きさ(横x縦)です。
Windows の場合
1 2 3 4 5 6 7 8 |
before show: QRect(0, 0, 640, 480) after show: QRect(488, 354, 200, 100) after showMaximized: QRect(0, 22, 1920, 1018) after showMinimized: QRect(0, 22, 1920, 1018) after showFullScreen: QRect(0, 0, 1920, 1080) after showNormal: QRect(488, 354, 200, 100) after setGeometry: QRect(100, 100, 300, 400) after showMinimized again: QRect(100, 100, 300, 400) |
Xubuntu/Ubuntu の場合
Xubuntu と Ubuntu では結果は同じでした。
1 2 3 4 5 6 7 8 |
before show: QRect(0, 0, 640, 480) after show: QRect(0, 0, 200, 100) after showMaximized: QRect(0, 0, 200, 100) after showMinimized: QRect(0, 0, 200, 100) after showFullScreen: QRect(0, 0, 200, 100) after showNormal: QRect(0, 0, 200, 100) after setGeometry: QRect(100, 100, 300, 400) after showMinimized again: QRect(100, 100, 300, 400) |
まとめ
上記の結果から、”geometry” プロパティに関して以下の事がわかりました。
- Windows / Linux 共に、show() の実行前は、仮の値として (0, 0, 640, 480) が入っている(VGA サイズということかと思われます)。
- show() を実行すると、両者ともサイズは 200×100 に変化する。ただし、表示位置は OS によって異なる。Linux では左上隅に、Windows ではやや右下にシフトした位置になる。
- Windows では、showMaximized/FullScreen/Normal の実行後、”geometry” は実際に表示されたウインドウのサイズに設定されるが、Linux ではこれらのメソッドは “geometry” を変化させない。(表示そのものは、最大化/フルサイズ/通常化します。つまり、表示されている状態と “geometry” の値が一致しません。)
- Windows でも (Linux も) showMinimized() は、”geometry” を変化させない。おそらく、ウインドウをただ見えなくしているだけという事だと思われる。
- もちろん、setGeometry() は、Windows / Linux 共に “geometry” を変化させる。
この結果から、Windows であれば、実際にウインドウが表示されていれば現在のウインドウサイズを “geometry” プロパティから知ることができますが、Linux の場合には “geometry” と現在のウインドウサイズが一致していない可能性があることがわかります。Linux では、自前で大きさを計算して setGeometry() で設定しないと両者を一致させられないようです。
[関連サイト]
junf/checkshow
[関連記事]
[参考にしたサイト]