QML - позиция главного окна при запуске (центр экрана) - PullRequest
4 голосов
/ 23 января 2012

Как я могу сделать следующее: я хочу, чтобы мое главное окно отображалось при запуске на центральном экране.

Ответы [ 5 ]

19 голосов
/ 27 июля 2014

Если вы используете QtQuick, это можно сделать:

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

ApplicationWindow {
    visible: true
    width: 320
    height: 480
    Component.onCompleted: {
        setX(Screen.width / 2 - width / 2);
        setY(Screen.height / 2 - height / 2);
    }
}
18 голосов
/ 17 октября 2014

Ответ Дильсона гораздо лучше, особенно если учесть, что виджеты не были упомянуты ... во всяком случае, вот еще более простая версия его ответа:

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
    }
}
1 голос
/ 28 декабря 2018

Ответ Александра почти достаточно хорош. Однако в 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 выполнил свою работу).

1 голос
/ 25 сентября 2018

После изучения обоих ответов и фактической отладки кода с помощью Qt 5.9.1 он показывает более одной проблемы с исходными ответами:

  1. Невозможно связать [x, y] с [width, height], если мы не хотим видеть странные эффекты с изменением размера.
  2. Несмотря на то, что [x, y] изменение в Component.onCompleted кажется логичным, оно не работает должным образом с 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
        }
    }
}

P.S. Если это так, я использовал тип ApplicationWindow, полученный из Window, и он должен соответствовать поведению Window.

1 голос
/ 23 января 2012

Вам нужно будет 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);
}

Оттуда должно быть достаточно просто придумать общую версию, которая обрабатывает центральный экран пользователя (если он существует).

...