2011-09-13 26 views
6

EDIT:このアプリケーションは、Windows、Mac、およびさまざまなLinuxディストリビューションで動作します。私はLinuxにこれに問題があることを認識していますが、Windowsはどうですか?マック?ウィンドウを作成する前にウィンドウ枠の幅を取得する方法は?

通常のウィンドウのフレームの幅を取得する方法はありますか。ウィンドウを表示した後、frameSize()からsize()を差し引くことができますが、ウィンドウが表示されるまで機能しません。

私はQApplication::style()->pixelMetric()見てきた、と私は

QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight) 

を使用して、タイトルバーの高さを得ることができますが、私は窓の周囲に境界線の残りの部分の幅を取得するために、任意のオプションが表示されません。

私がこれまでに見つけた唯一の解決策は、以下のとおりです。

  • その後、減算ウィンドウを示し、(ユーザがそれを見ていない)を0にウィンドウの不透明度を設定しますsize()からframeSize()

良い方法はありますか?

+0

タイトルにタグを追加する必要はありません – Smar

答えて

3

QtのドキュメントページWindow and Dialog Widgetsには、これに関する多くの情報が含まれています。

答えが「いいえ」、より良い方法はありませんのようです、あなたはあなたが実行しているものをプラットフォーム言いませんが、それはそれはX11です:

X11特殊性

は、

X11では、ウィンドウマネージャはウィンドウを装飾するまでフレームを保持しません。これは、QWidget :: show()とウィンドウが受け取る最初のペイントイベントを呼び出した後のある時点で非同期的に発生するか、まったく発生しません。 X11にはポリシーが適用されないことに注意してください(他は柔軟性があります)。したがって、あなたの窓が得る装飾フレームについて、安全な前提を作ることはできません。基本ルール:常にあなたの前提を壊し、あなたに不平を言うウィンドウマネージャーを使用する1人のユーザーがいます。

(Iは0に不透明度を設定するあなたの回避策が好き!:ニート)

+0

私はそのQt docページを見ました。ありがとうございました。私はそれを言及すべきだった。私は元の質問を編集して、より明確にすることを願っています。あなたは回避策が好きでうれしい! –

5

私はStackOverflowのでは別の質問で提案された解決策を掲載、私はここにもそれを投稿します。ウィンドウを表示する前に画面外のどこかにウインドウを移動し、ジオメトリを照会し、最後にジオメトリが必要な場所に移動することができます。

MainWindow mainWindow; 
QRect primaryScreenGeometry(QApplication::desktop()->screenGeometry()); 
mainWindow.move(-50000,-50000); 
mainWindow.show(); 
mainWindow.move((primaryScreenGeometry.width() - mainWindow.width())/2.0, 
       (primaryScreenGeometry.height() - mainWindow.height())/2.0); 

は、私が唯一のWindows XPとのQt 4.8.x.にこのコードをテストしてみた:インスタンスがちらつきなし、主画面上のメインウィンドウを中央にするために、私は次の操作を行いますうまくいけば、それは他のプラットフォームでもうまくいきます。

関連する問題