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
¿Fue útil?

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().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top