2009-09-05 6 views
1

Mon QMainWindow contient un QGraphicsView, qui doit avoir une largeur et une hauteur minimales. Alors, je l'ai utilisé le code suivant dans le constructeur QMainWindow:Définition de QMainWindow au centre de l'écran

ui.graphicsView->setMinimumHeight(VIEWWIDTH); 
ui.graphicsView->setMinimumWidth(VIEWWIDTH); 

J'ai ensuite utilisé le code suivant pour définir QMainWindow au centre de l'écran:

QRect available_geom = QDesktopWidget().availableGeometry(); 
QRect current_geom = frameGeometry(); 
setGeometry(available_geom.width()/2 - current_geom.width()/2, 
      available_geom.height()/2 - current_geom.height()/2, 
      current_geom.width(), 
      current_geom.height()); 

Mais ce ne sont pas mis à la centre de l'écran. Si j'omets setMinimumHeight() et setMinimumWidth() de QGraphicsView, alors la fenêtre principale est placée au centre de l'écran. Comment surmonter ce problème? J'utilise Qt 4.5.2.

Merci.

+0

Le positionnement manuel des fenêtres est généralement déconseillé. C'est le travail du gestionnaire de fenêtres de positionner les fenêtres et si votre application se centre manuellement, cela conduira à des incohérences. Par exemple sur mon système à deux têtes, où votre code placera-t-il la fenêtre? Sauf si vous avez une très bonne raison, ne pas microgérer le placement de la fenêtre. –

+0

J'ai vu un logiciel qui commence au milieu de l'écran. Ça à l'air bon. – Donotalo

Répondre

2

Le problème que vous rencontrez est que Qt retardera de nombreux calculs aussi longtemps que possible. Lorsque vous définissez la largeur et la hauteur minimales de votre affichage graphique, il définit un indicateur dans lequel la fenêtre dans laquelle la vue graphique doit être déployée. Cependant, il ne le fera pas avant d'avoir ... quelques millisecondes avant de s'afficher à l'écran. Ainsi, lorsque vous appelez rect() sur votre fenêtre principale, vous obtenez l'ancien rectangle, et non le nouveau.

Ma meilleure recommandation est d'étendre l'événement de changement de taille dans votre fenêtre principale et d'ajuster le positionnement dans cet événement. Vous devrez peut-être aussi signaler quand la fenêtre a été réellement montrée, de sorte que vous ne repositionnez pas la fenêtre si l'utilisateur la redimensionne après qu'elle ait été montrée.

Alternativement, vous pourriez essayer de repositionner la fenêtre en étendant la fonction d'événement d'exposition et en le faisant là. Cela arriverait probablement avant que l'utilisateur ne voit la fenêtre, mais pourrait scintiller à l'occasion.

Questions connexes