8
votes

QML - Position de la fenêtre principale sur Démarrer (Centre d'écran)

Comment puis-je faire après: J'aimerais montrer ma fenêtre principale sur démarrer sur l'écran central.


0 commentaires

6 Réponses :


1
votes

Vous aurez besoin de Sétigométrie sur votre widget de haut niveau avant de le montrer. La façon la plus simple que je puisse penser de savoir quelle géométrie vous avez besoin est via qdesktopwidget code> . Essayez l'exemple ci-dessous (Créez un qpushbutton code>, appuyez sur enfoncé tout en déplaçant le widget autour de divers écrans) et vous verrez ce que je veux dire:

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


0 commentaires

26
votes

Si vous utilisez Qtquick, il est possible de le faire:

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
    }
}


2 commentaires

Sur la convivialité, c'est la meilleure réponse pour moi. Précipité


Comme mention dans Les commentaires de l'autre réponse , On devrait plutôt utiliser la propriété écran au lieu de l'écran singleton. Citant la documentation de l'écran type : "Notez que le type d'écran n'est pas valide au composant.Oncommanded, car l'élément ou la fenêtre n'a pas été affiché sur un écran à l'heure."



21
votes

La réponse de Dielson est beaucoup mieux, d'autant plus que les widgets n'étaient pas mentionnés ... Quoi qu'il en soit, voici une version encore plus simple de sa réponse:

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
    }
}


6 commentaires

Pour ApplicationWindow Il existe une propriété .


Les deux personnes ne peuvent pas voir ça tout de suite ou ils n'ont pas essayé? BTW, qu'en est-il de la situation multi-surveillance? La seule façon correcte utiliserait l'écran de la fenêtre alors. doc.qt.io/qt-5/ qml-qtquick-window-window.html # écran-accessoire


Pas certain. Cela pourrait avoir travaillé (redimensionné sans problèmes) en 2014.


Absolument sûr et vérifié juste hier sur Ubuntu avec 2 moniteurs de différentes dimensions. Selon le moniteur principal et comporte l'index 0 ou l'écran, il existe un bogue de centrage incorrect de la fenêtre.


J'ai dit que je ne suis pas sûr - je parle pour moi-même. Il est bon que vous vérifiez que vous vérifiez ce problème, mais je ne comptate pas de configurations multi-surveillants dans ma réponse, alors n'hésitez pas à fournir le vôtre.


Gratter ça. Fournir ma réponse aussi.



2
votes

Après avoir examiné les deux réponses et déboguer en réalité le code avec Qt 5.9.1, il affiche plus d'un problème avec les réponses originales:

  1. ne peut pas lier [x, y] à [largeur, hauteur] sauf si nous voulons voir des effets étranges avec le redimensionnement. Li>
  2. même si [x, y] change dans composant.oncompleté code> semble être logique, cela ne fonctionne pas comme prévu avec 2 moniteurs de DPI différents (comme sur les systèmes que je développe actuellement). li>
  3. besoin d'utiliser fenêtre.Screen code> au lieu de écran code> Singleton Type. De cette façon, nous obtenons l'écran réel correspondant à la fenêtre sur. Li>
  4. to complètement détachent [x, y] des valeurs dynamiques mais l'écran réel de la fenêtre Au moment de la fenêtre initiale montrant que nous utilisons maintenant surCreenchged code> qui est un gestionnaire pour l'écran Code> Changement de propriété. LI> ol>

    Cette solution est plus complète et utilise fenêtre.Screen Propriété: P>

    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
            }
        }
    }
    


1 commentaires

J'ai testé cela avec Qt 5.15 sur MacOS, mais le OnScreenched n'est pas appelé lorsque la fenêtre est initialement indiquée. Seulement lorsque la fenêtre est déplacée vers un autre écran. Pourrait être cela changé quelque peu ..



1
votes

La réponse d'Alexandre est presque assez bonne. Cependant, sur KDE, j'observe le comportement suivant: la fenêtre est ouverte pour la première fois sur le moniteur 1, puis est immédiatement déplacée sur le moniteur 2. Dans cette situation, la réponse référencée oblige toujours la fenêtre à surveiller 1.

car essayant de la détecter. Le comportement nécessiterait probablement un peu de code, je viens d'aller une solution simple en utilisant une minuterie: xxx

Ceci définit les coordonnées de la fenêtre après avoir attendu 10 ms (espérons-le que le temps de DE a fait son travail).


0 commentaires

0
votes

Toutes les autres réponses sont manquantes à prendre en compte le positionnement de l'écran en tenant potentiellement à l'origine de la fenêtre sur le mauvais écran. Peut-être que cela utilisait pour travailler dans la version précédente de qt, mais cela ne semble plus fonctionner avec des versions QT récentes.

La solution suivante fonctionne pour moi avec un écran multi-écran avec une configuration DPI différente (nécessite QT 5.9 ou ultérieur; testé avec Qt 5.15 sur MacOS): P>

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


0 commentaires