2009-06-27 18 views
13

tengo QMainWindow. Tiene este parámetros:Activar ventana

this->setWindowFlags(Qt::Tool); 
this->setFocusPolicy(Qt::StrongFocus); 
this->setAttribute(Qt::WA_QuitOnClose,true); 

Después ShowEvent Calles se muestra la ventana de mi pero no activado. Traté de sobrecargar función show:

...  
QMainWindow::showEvent(event); 
this->activateWindow(); 
... 

Pero no me ayuda.

EDIT: cuando me comentó línea

this->setWindowFlags(Qt::Tool); 

todo funcionaba bien, pero necesito en herramienta de bandera. Alguna idea?

EDIT:

  • SO: Linux lenguaje
  • de programación: C++
  • Qt versión: 4.5.1

Respuesta

13

El Administrador de Windows Decide

Antes de empezar: Como ha señalado elcuco y Javier, centrar la política y otros aspectos de la disposición de las ventanas (por ejemplo, la barra de título) pertenece a una sustancial se extiende a las respectivas ventanas gerente, y Qt podría tener un control limitado. Para ver esto, solo mira una interfaz de usuario que tiene una política "focus follows mouse". En estos casos, el administrador de Windows puede ignorar la solicitud de enfoque de Qt. Por esta razón, la documentación de Qt llama a muchas de las banderas respectivas "pistas". En consecuencia, algunas de las soluciones sugeridas pueden o no funcionar para usted.

QApplication :: SetActiveWindow()

Esto, no obstante e.tadeu's solución de usar QApplication::setActiveWindow() funciona para mí tanto para Windows y Ubuntu con Gnome. Lo probé con el siguiente código. Disculpa que Python utiliza PyQt (utilizo preguntas como estas para aprender un poco sobre PyQt). Debería ser bastante fácil para usted leerlo y traducirlo a C++.

import sys 

from PyQt4 import QtGui 
from PyQt4 import QtCore 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self) 

     # main window 
     self.setGeometry(300, 300, 250, 150) 
     self.setWindowTitle('Test') 

     # text editor 
     self.textEdit = QtGui.QTextEdit() 
     self.setCentralWidget(self.textEdit) 

    def closeEvent(self, event): 
     QtGui.QApplication.instance().quit() 

#main 
app = QtGui.QApplication(sys.argv) 
testWindow = MainWindow() 
testWindow.setWindowFlags(QtCore.Qt.Tool) 
testWindow.show() 
app.setActiveWindow(testWindow) 
app.exec_() 

Tenga en cuenta que usted tiene que añadir un poco de manejo del evento de cierre de la testWindow, ya que la aplicación no sale de forma automática si se cierra una ventana Qt::Tool.

El grabKeyboard() Hack

Si esto no funciona para usted, el siguiente podría truco. Supongo que tiene una ventana en su aplicación que está activa. A continuación, puede usar grabKeyboard() para redirigir la entrada. La ventana Qt::Tool no obtiene el foco, pero recibe la entrada. El siguiente código principal lo demuestra (el otro código permanece sin cambios).

#main 
app = QtGui.QApplication(sys.argv) 
testWindow = MainWindow() 
testWindow.setWindowFlags(QtCore.Qt.Tool) 
testWindow2 = MainWindow() # second window which is active 
testWindow2.show() 
testWindow.show() 
testWindow.textEdit.grabKeyboard() 
app.exec_() 

Básicamente, mientras que la ventana testWindow2 es el activo, todo el texto introducido aparece en testWindow.textEdit. No es agradable, lo sé ...

en crear su propia ventana

Se gana la mayor flexibilidad (y crear la mayor parte del trabajo por sí mismo) por el despliegue de su propio diseño de la ventana. La idea se describe en el siguiente FAQ.

Otros "Soluciones"

se le puede llamar directamente a la función API del gestor de ventanas correspondiente para obtener el resultado deseado (claramente en contra de la razón para el uso de Qt en el primer lugar). También podría piratear el código fuente de Qt.Por ejemplo, en Windows, Qt usa la función ShowWindow() con un indicador SW_SHOWNOACTIVATE, para mostrar una ventana con el estilo WS_EX_TOOLWINDOW si establece el indicador Qt::Tool. Puede reemplazar fácilmente el SW_SHOWNOACTIVATE con lo que desee. Linux debería ser lo mismo. Claramente tampoco recomendado.

1

Qué sistema operativo? ¿Qué Qt4?

En Linux está condenado, el administrador de ventanas puede ignorar lo que le está diciendo. Manténlo bajo consideración.

+0

Información adicional para publicar. – Ockonal

0

¿Ocurre lo mismo si solo lo convierte en un QWidget normal en lugar de un QMainWindow?

Además, quizás sea mejor tratar de lograr el efecto que necesite Qt :: Tool por otros medios si eso es posible?

3

Intente utilizar QApplication :: SetActiveWindow()

4

La manzana original, Human Interface Guidelines (*) dijeron que las ventanas eran de caja de herramientas "siempre en la parte superior, pero nunca activado". También aconseja no usar cuadros de texto en ellos, precisamente porque la falta de respuesta del estado de activación.

Comprueba cómo se comportan otras aplicaciones 'toolbox heavy'. Recuerdo débilmente que al menos GIMP e InkScape parecen muy diferentes en este aspecto.

Como dijo elcuco, el administrador de ventanas puede hacer lo que quiera con los indicadores de Qt. Además, seguro sería diferente en KDE, Gnome, fluxbox, lo que sea.

(*): ¡excelente documento! algo anticuado; pero las ventanas de herramientas que ya fueron utilizados y considerados

0

En cuanto a Qt :: WindowFlags Herramienta Para citar documentación de Qt

Indica que el widget es un ventana de herramientas. Una ventana de herramientas a menudo es una pequeña ventana de con una barra y decoración de título más pequeño que el habitual , que se utiliza normalmente para las colecciones de herramientas . Si hay es uno de los padres, la ventana de la herramienta será siempre se mantendrá encima de ella.Si hay no es uno de los padres, puede considerar el uso de Qt :: WindowStaysOnTopHint también. Si el sistema de ventana lo admite, una ventana de herramienta se puede decorar con un marco un poco más ligero . También se puede combinar con Qt :: FramelessWindowHint

Parece que las banderas es un problema y usando Qt :: WindowStaysOnTopHint debe resolver su problema.

0

Simplemente llame al show() después de setWindowFlags().

Cuestiones relacionadas