2010-08-06 43 views
6

He intentado esto en el constructor de mi MainForm:cómo centrar una forma principal de Qt en la pantalla?

QRect desktopRect = QApplication::desktop()->availableGeometry(this); 
move(desktopRect.center() - frameGeometry().center()); 

QRect desktopRect = QApplication::desktop()->availableGeometry(this); 
move(desktopRect.center() - rect().center()); 

pero ambos puse la esquina inferior derecha de la forma más o menos al centro de la pantalla, en lugar de centrar el formulario. ¿Algunas ideas?

Respuesta

10

He intentado esto en el constructor de mi MainForm

Eso es probablemente el problema. Probablemente no tenga información de geometría válida en este punto porque el objeto no está visible.

Cuando el objeto se construye en primer lugar, se posiciona esencialmente a (0,0) con él espera (width,height), como tal:

frame geometry at construction: QRect(0,0 639x479) 

Pero, después de haber sido mostrado:

frame geometry rect: QRect(476,337 968x507) 

Por lo tanto, no se puede sin embargo, confíe en su información de frameGeometry().

EDITAR: Dicho esto, supongo que se puede mover fácilmente como se desee, pero por lo completo que estoy cayendo en Patrice's code que no depende de la información de la geometría del cuadro:

Rect desktopRect = QApplication::desktop()->availableGeometry(this); 
QPoint center = desktopRect.center(); 

move(center.x()-width()*0.5, center.y()-height()*0.5); 
+0

Encontré que funciona si llamo 'this-> resize (width_I_want, height_I_want)' antes del código para centrarlo. ¡Gracias! –

+0

Eso es interesante. ¿Cómo cambia eso la geometría del cuadro? –

3

La función de movimiento (consulte QWidget doc) toma un QPoint o dos int como parámetro. Esto corresponde a las coordenadas de la esquina superior izquierda de su Widget (en relación con su principal, Here OS Desktop). Probar:

QRect desktopRect = QApplication::desktop()->availableGeometry(this); 
QPoint center = desktopRect.center(); 

move(center.x()-width*0.5, center.y()-height*0.5); 
0

Otro solución, asumiendo la ventana en cuestión es de 800 × 800:

QRect rec = QApplication::desktop()->availableGeometry(); 
move(QPoint((rec.width()-800)/2, (rec.height()-800)/2)); 
Cuestiones relacionadas