Comment puis-je faire après: J'aimerais montrer ma fenêtre principale sur démarrer sur l'écran central. P>
6 Réponses :
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);
}
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 } }
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 code> au lieu de l'écran
code> singleton. Citant la documentation de l'écran code> type code>: "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."
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 } }
Pour ApplicationWindow Code> Il existe une propriété code> code>.
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 code> code> de la fenêtre code> 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.
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:
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>
- 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>
- 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
}
}
}
J'ai testé cela avec Qt 5.15 sur MacOS, mais le OnScreenched code> 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 ..
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: p> 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). p> p>
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; } }