Pregunta
tengo un QMainWindow. Tiene estos parámetros:
this->setWindowFlags(Qt::Tool); this->setFocusPolicy(Qt::StrongFocus); this->setAttribute(Qt::WA_QuitOnClose,true);
Después de showEvent calles, mi ventana se muestra pero está desactivada. Traté de sobrecargar la función show:
...
QMainWindow::showEvent(event);
this->activateWindow();
...
Pero no me ayuda.
EDITAR: Cuando comenté la línea
this->setWindowFlags(Qt::Tool);
todo funcionó bien, pero lo necesito en tool-flag. ¿Alguna idea?
EDIT:
- SO: Linux
- Lenguaje de programación: c ++
- Versión Qt: 4.5.1
Solución
El administrador de Windows decide
Antes de comenzar: como lo señala elcuco y Javier , la política de enfoque y otros aspectos del diseño de Windows (por ejemplo, la barra de título) pertenecen en gran medida a el administrador de Windows respectivo, y Qt podría tener un control limitado. Para ver esto, solo mire una interfaz de usuario que tiene un & Quot; el foco sigue al mouse " política. En estos casos, el administrador de Windows podría ignorar la solicitud de enfoque de Qt. Por esta razón, la documentación de Qt llama a muchas de las banderas respectivas & Quot; pistas & Quot ;. En consecuencia, algunas de las soluciones sugeridas pueden o no funcionar para usted.
QApplication::setActiveWindow()
No obstante, e.tadeu solución para utilizar QApplication::setActiveWindow()
me funciona tanto para Windows como para Ubuntu con Gnome. Lo probé con el siguiente código. Disculpas de que sea Python usando PyQt (uso 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 debe agregar algo de manejo del evento de cierre de testWindow
, porque la aplicación no se cierra automáticamente si cierra una ventana Qt::Tool
.
El grabKeyboard () Hack
Si esto no funciona para usted, el siguiente truco podría funcionar. Supongo que tiene una ventana en su aplicación que está activa. Luego puede usar grabKeyboard()
para redirigir el entrada. La ventana testWindow2
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 la ventana testWindow.textEdit
es la activa, todo el texto ingresado aparece en ShowWindow()
. No es agradable, lo sé ...
Creación de su propia ventana
Obtiene la mayor flexibilidad (y crea la mayor cantidad de trabajo para usted) al desplegar su propio diseño de ventana. La idea se describe en las siguientes Preguntas frecuentes .
Otro "Solutions"
Puede llamar directamente a la función API del administrador de ventanas respectivo para obtener el resultado deseado (claramente en contra de la razón misma para usar Qt en primer lugar). También puedes hackear el código fuente de Qt. Por ejemplo, en Windows, Qt usa el SW_SHOWNOACTIVATE
con una bandera WS_EX_TOOLWINDOW
, para mostrar una ventana con estilo <=> si establece la bandera <=>. Puedes reemplazar fácilmente el <=> con lo que quieras. Linux debería ser lo mismo. Claramente tampoco recomendado.
Otros consejos
Intente utilizar QApplication :: setActiveWindow ()
Las Pautas originales de la interfaz humana de Apple (*) decían que las ventanas de la caja de herramientas estaban & "; siempre en la parte superior pero nunca activadas &"; También desaconseja el uso de cuadros de texto en ellos, precisamente por la falta de retroalimentación del estado de activación.
Comprueba cómo se comportan otras aplicaciones 'toolbox heavy'. Recuerdo débilmente que al menos GIMP y InkScape parecen muy diferentes en este aspecto.
Como elcuco , el administrador de ventanas puede hacer lo que quiera con las banderas de Qt . Además, seguramente sería diferente en KDE, Gnome, fluxbox, lo que sea.
(*): ¡excelente documento! algo anticuado; pero las ventanas de herramientas ya se usaron y se consideraron
¿Qué sistema operativo? ¿Qué Qt4?
En Linux estás condenado, el administrador de ventanas puede ignorar lo que le estás diciendo. Mantenlo bajo consideración.
¿Sucede lo mismo si solo lo convierte en un QWidget normal en lugar de un QMainWindow?
Además, ¿quizás sea mejor que intentes lograr el efecto que necesites para Qt :: Tool por otros medios si es posible?
Acerca de Qt :: Tool WindowFlags Para citar la documentación de Qt
Indica que el widget es una herramienta ventana. Una ventana de herramientas es a menudo un pequeño ventana con un título más pequeño de lo habitual barra y decoración, típicamente utilizada para colecciones de botones de herramientas. Allí es un padre, la ventana de herramientas estar siempre al tanto. Sí hay no es un padre, puede considerar usar Qt :: WindowStaysOnTopHint también. Si el sistema de ventanas lo soporta, una herramienta la ventana se puede decorar con un Marco algo más ligero. También puede ser combinado con Qt :: FramelessWindowHint
Parece que las banderas son un problema y el uso de Qt :: WindowStaysOnTopHint debería resolver su problema.
Simplemente llame a show()
después de setWindowFlags()
.