次の方法:中央の画面の開始時にメインウィンドウを表示したいのですが。
6 に答える
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
}
}
特にウィジェットが言及されていないので、ディエルソンの答えははるかに優れています...とにかく、ここに彼の答えのさらに単純なバージョンがあります:
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
}
}
両方の応答を調べ、Qt 5.9.1でコードを実際にデバッグした後、元の応答に複数の問題が表示されます。
- サイズ変更で奇妙な効果を見たい場合を除いて、[x、y]を[width、height]にバインドすることはできません。
- [x、y]の変更は
Component.onCompleted
論理的であるように見えますが、異なるDPIの2台のモニターでは期待どおりに機能しません(現在開発しているシステムの場合と同様)。 - シングルトンタイプ
Window.screen
の代わりに使用する必要があります。Screen
そうすれば、上のウィンドウに一致する実際の画面を取得できます。 - [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
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);
}
ユーザーの中央画面(存在する場合)を機能させる汎用バージョンを考え出すには、そこからかなり単純である必要があります。
アレクサンダーの答えはほぼ十分です。ただし、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がその仕事を完了したことを願っています)。
画面の位置を考慮に入れるために他のすべての答えが欠落しているため、ウィンドウが間違った画面に表示される可能性があります。たぶん、これは以前のバージョンの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;
}
}