2011-09-13 16 views
6

EDITAR: esta aplicación se ejecutará en Windows, Mac y varias distribuciones de Linux. Soy consciente de que Linux tiene problemas con esto, pero ¿qué pasa con Windows? ¿Mac?¿Cómo obtener el ancho de un marco de ventana antes de crear cualquier ventana?

¿Hay alguna manera de obtener el ancho del marco para una ventana normal, ANTES de mostrar las ventanas? Después de mostrar una ventana, sé que puedo restar el size() del frameSize(), pero eso no funciona hasta que se muestra la ventana.

He mirado en QApplication::style()->pixelMetric(), y puedo conseguir la altura de la barra de título usando

QApplication::style()->pixelMetric(QStyle::PM_TitleBarHeight) 

pero aún no hay opciones para obtener el ancho del resto del borde alrededor de la ventana .

La única solución que he encontrado hasta ahora es:

  • establecer la opacidad ventana a 0 (lo que el usuario no lo ve),
  • la ventana del
  • luego restar size() de frameSize()

¿Hay una manera mejor?

+0

No hay necesidad de agregar etiquetas al título – Smar

Respuesta

3

En caso de que no lo haya visto, la página de Qt doc Window and Dialog Widgets contiene mucha información al respecto.

Usted no dice qué plataforma se está ejecutando, pero que es X11, la respuesta parece ser 'no', no hay una mejor manera:

X11 Peculiaridades

En X11, una ventana no tiene un marco hasta que el administrador de ventanas lo decora. Esto ocurre de forma asincrónica en algún momento después de llamar a QWidget :: show() y al primer evento de pintura que recibe la ventana, o no sucede en absoluto. Tenga en cuenta que X11 está libre de políticas (otros lo llaman flexible). Por lo tanto, no puede hacer ninguna suposición segura sobre el marco de decoración que obtendrá su ventana. Regla básica: siempre hay un usuario que usa un administrador de ventanas que rompe su suposición y que se quejará con usted.

(me gusta su solución de establecer la opacidad a 0: puro)

+0

He consultado esa página de Qt doc, gracias. Debería haber mencionado eso. Edité la pregunta original para dejarla más clara. ¡Me alegra que te guste la solución! –

5

he publicado una propuesta de solución en una pregunta diferente en stackoverflow, pero lo voy a publicar aquí también. Puede mover la ventana a un lugar muy alejado de la pantalla antes de mostrarla y luego consultarla por su geometría, y finalmente moverla a donde lo desee (si para eso necesita la geometría). Por ejemplo, para centrar una ventana principal en la pantalla principal sin oscilar hago lo siguiente:

MainWindow mainWindow; 
QRect primaryScreenGeometry(QApplication::desktop()->screenGeometry()); 
mainWindow.move(-50000,-50000); 
mainWindow.show(); 
mainWindow.move((primaryScreenGeometry.width() - mainWindow.width())/2.0, 
       (primaryScreenGeometry.height() - mainWindow.height())/2.0); 

sólo lo he probado este código en Windows XP y Qt 4.8.x. Esperemos que también funcione en otras plataformas.

Cuestiones relacionadas