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.
Información adicional para publicar. – Ockonal