8

次の方法:中央の画面の開始時にメインウィンドウを表示したいのですが。

4

6 に答える 6

27

QtQuickを使用している場合は、次のことが可能です。

import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0

ApplicationWindow {
    visible: true
    width: 320
    height: 480
    Component.onCompleted: {
        // Commenting this to use properties instead of setters
        //setX(Screen.width / 2 - width / 2);
        //setY(Screen.height / 2 - height / 2);
        x = Screen.width / 2 - width / 2
        y = Screen.height / 2 - height / 2
    }
}
于 2014-07-26T23:11:09.840 に答える
21

特にウィジェットが言及されていないので、ディエルソンの答えははるかに優れています...とにかく、ここに彼の答えのさらに単純なバージョンがあります:

import QtQuick 2.0
import QtQuick.Window 2.0

Window {
    visible: true
    x: Screen.width / 2 - width / 2
    y: Screen.height / 2 - height / 2
    width: 320
    height: 480
}

アレクサンダーが述べたように、このバインディングは奇妙なサイズ変更動作を引き起こす可能性があります。そのため、ディエルソンの答えを使用することをお勧めします。私が言及する唯一のことは、QMLでセッターを使用することは一般的ではないということです。一部のシステム(プロパティインターセプターと呼ばれていると思います)は、たとえば、アニメーションを実行するために設定されているプロパティに依存しています。したがって、より一般的なアプローチは次のとおりです。

import QtQuick 2.0
import QtQuick.Window 2.0

Window {
    visible: true
    width: 320
    height: 480

    Component.onCompleted: {
        x = Screen.width / 2 - width / 2
        y = Screen.height / 2 - height / 2
    }
}
于 2014-10-17T11:26:13.867 に答える
2

両方の応答を調べ、Qt 5.9.1でコードを実際にデバッグした後、元の応答に複数の問題が表示されます。

  1. サイズ変更で奇妙な効果を見たい場合を除いて、[x、y]を[width、height]にバインドすることはできません。
  2. [x、y]の変更はComponent.onCompleted論理的であるように見えますが、異なるDPIの2台のモニターでは期待どおりに機能しません(現在開発しているシステムの場合と同様)。
  3. シングルトンタイプWindow.screenの代わりに使用する必要があります。Screenそうすれば、上のウィンドウに一致する実際の画面を取得できます。
  4. [x、y]を動的な値から完全に解くために、最初のウィンドウが表示されている時点での実際のウィンドウ画面は、プロパティ変更onScreenChangedのハンドラーであるを使用しています。screen

このソリューションはより完全で、Window.screenプロパティを使用します。

ApplicationWindow {
    id: window
    property bool screenInit: false

    title: qsTr("App Window Positioning")
    visible: true

    height: Theme.windowHeight // initial
    width: Theme.windowWidth   // initial

    Connections {
        target: window
        onScreenChanged: if (!screenInit) {
            // we have actual screen delivered here for the time when app starts
            screenInit = true
            window.x = screen.width / 2 - Theme.windowWidth / 2
            window.y = screen.height / 2 - Theme.windowHeight / 2
        }
    }
}

PSもしそうなら、私ApplicationWindowはから派生したタイプを使用しました、そしてそれはポジショニングの振る舞いWindowと一致しているはずです。Window

于 2018-09-24T22:30:18.193 に答える
1

setGeometry表示する前に、トップレベルのウィジェットを表示する必要があります。必要なジオメトリを見つけるために私が考えることができる最も簡単な方法は、を介することQDesktopWidgetです。以下の例を試してみてください(を作成しQPushButton、ウィジェットをさまざまな画面上で動かしながら押してください)。私が何を意味するかがわかります。

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{   
  ui->setupUi(this);
  connect(ui->pushButton, SIGNAL(released()), this, SLOT(ButtonPressed()));
}

MainWindow::~MainWindow()
{
  delete ui;
}

void MainWindow::ButtonPressed()
{
  qDebug() << QApplication::desktop()->screenCount();
  qDebug() << QApplication::desktop()->screenNumber();
  qDebug() << QApplication::desktop()->screenGeometry(this);
}

ユーザーの中央画面(存在する場合)を機能させる汎用バージョンを考え出すには、そこからかなり単純である必要があります。

于 2012-01-23T13:35:07.740 に答える
1

アレクサンダーの答えはほぼ十分です。ただし、KDEでは、次の動作が見られます。ウィンドウは最初にモニター1で開かれ、すぐにモニター2に移動されます。この状況では、参照された回答によって常にウィンドウがモニター1に強制されます。

この動作を検出しようとすると、おそらくかなりのコードが必要になるため、タイマーを使用して簡単な解決策を探しました。

ApplicationWindow {
  id: window

  visible: true
  height: 320
  width: 480

  function setCoordinates() {
    x += screen.width / 2 - width / 2
    y += screen.height / 2 - height / 2
  }

  Timer {
    id: timer
    running: true
    repeat: false
    interval: 10
    onTriggered: {
      window.setCoordinates();
    }
  }
}

これにより、10ミリ秒待機した後のウィンドウの座標が設定されます(その間にDEがその仕事を完了したことを願っています)。

于 2018-12-28T17:08:16.917 に答える
0

画面の位置を考慮に入れるために他のすべての答えが欠落しているため、ウィンドウが間違った画面に表示される可能性があります。たぶん、これは以前のバージョンのQtで機能していましたが、最近のQtバージョンでは機能しなくなったようです。

次の解決策は、DPI設定が異なるマルチスクリーンで機能します(Qt 5.9以降が必要です。macOSでQt5.15でテストされています)。

import QtQuick 2.9
import QtQuick.Window 2.9

Window {
    id: root
    visible: true
    width: 320
    height: 480

    Component.onCompleted: {
        root.x = root.screen.virtualX + root.screen.width / 2 - root.width / 2;
        root.y = root.screen.virtualY + root.screen.height / 2 - root.height / 2;
    }
}
于 2021-01-08T14:29:52.970 に答える