5

何ヶ月にもわたる試行、検索、コードのレビューなどの後、QT で新しいウィンドウを適切に配置するための解決策を見つけることができません。私の最も基本的なケースでは、ウィンドウの最終的なサイズを取得して、マウスの下の中央に配置したいだけです。ウィンドウのどの部分も画面の外に出ないようにシフトされます。特にデスクトップFXがオンになっている場合、ウィンドウが表示されてから所定の位置に移動することは望ましくありません。

私が遭遇した問題、すべてが適切な解決策を持っているわけではありません:

  1. frameGeometry は、ウィンドウが表示される前に常に読み込まれるとは限りません。

  2. 特に Windows 7 では、frameGeometry が完全に間違っていることがあります。

  3. sizeHint または size が適用されるかどうか、またはその間の何かが適用されるかどうかを表示する前に知ることはできません。つまり、サイズ ポリシーは予測可能ではないようです。

以前に作成したウィンドウのジオメトリを保存/復元する方法を知っていることに注意してください。ここでもQTの欠陥にもかかわらず、私は実用的な解決策を持っています。

また、ウィンドウ マネージャーの既定の配置を使用できないことにも注意してください。マルチモニター構成の非 MDI アプリの場合、それらの配置はひどいものです (多くの場合、マウスと同じモニター上にさえありません)。

また、ソリューションを実装するためだけにすべてのウィジェットとダイアログをサブクラス化することも避けたいと思います。これは一般的ではないためです。これが唯一の可能な方法である場合は、喜んで検討します (イベント フィルターもオプションではないはずです)。

誰かが実行可能な解決策を持っていますか?

4

3 に答える 3

6

より科学的に見えるように 編集processEvents: 任意の呼び出し回数を、戻り値をチェックするループに変更しました。

再編集:新しいバージョンは安全ではないようです: ループに陥る可能性があります。そのため、反復回数に制限を設けました。

原文:
教えてください。私が自分のコードから引用することを許可される場合:

// BIG PAIN: We want to get the dialog box to caluclate its own size. But there is
// no simple way to do this. The following seems to work, but only if processEvents
// is called at least twice. God knows why:
setAttribute (Qt::WA_DontShowOnScreen, true) ; // Prevent screen flicker
show() ;

QEventLoop EventLoop (this) ;
for (int i = 0 ; i < 10 ; i++)
  if (!EventLoop.processEvents()) break ;

hide() ;
setAttribute (Qt::WA_DontShowOnScreen, false) ;

int x = 99 ; // whatever
int y = 99 ; // whatever

// Make sure it fits on the screen
QRect ScreenRect = qApp -> desktop() -> availableGeometry (ApplicationData -> mainWindow) ;

if (x + frameGeometry().width() > ScreenRect.right())
  x = ScreenRect.right() - frameGeometry().width() ;
if (x < ScreenRect.x()) x = ScreenRect.x() ;

if (y + frameGeometry().height() > ScreenRect.bottom())
  y = ScreenRect.bottom() - frameGeometry().height() ;
if (y < ScreenRect.y()) y = ScreenRect.y() ;

move (x, y) ;

の呼び出し回数を変えて、これを試してくださいprocessEvents。(これらの呼び出しでは、さまざまなサブウィジェットとサブサブウィジェットが再帰的にサイズ変更されます。)

于 2011-03-24T10:18:46.037 に答える
1

表示される前にウィンドウのサイズを照会できないという問題に関しては、簡単な回避策があります。ウィンドウを表示する前に、ウィンドウを画面のはるか外側に移動できます。たとえば、メインウィンドウをちらつきなくメイン画面の中央に配置するには、次のようにします。

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);

このコードは、WindowsXPとQt4.8.xでのみテストしました。うまくいけば、他のプラットフォームでも動作します。

于 2012-12-17T00:15:35.340 に答える
-1

レイアウトをアクティブ化してみましたか。サイズと位置を計算するように強制します

QLayout :: activate()

この呼び出しの後、ウィジェットは正しいサイズになっているはずです。

于 2011-08-26T09:36:49.460 に答える