2012-09-05 30 views
7

Estoy tratando de enfocar una ventana si el usuario hace clic en otra ventana.PyQt Window Focus

Ahora tengo dos ventanas: la ventana A está detrás y la ventana B está al frente. Cuando aparezca la ventana B, se deshabilita la ventana A. Ahora lo que quiero es que cada vez que el usuario hace clic fuera de la ventana B, se debe dar atención de nuevo a la ventana B.

Aquí está el código de la ventana B:

class window_b(QtGui.QDialog): 
    def __init__(self,parent=None): 
     super(window_b, self).__init__(parent) 
     window_a.setEnabled(False) 
     self.ui = Ui_Form_window_b() 
     self.ui.setupUi(self) 
     self.setFocusPolicy(QtCore.Qt.StrongFocus) 

    def focusOutEvent(self,event): 
     self.setFocus(True) 
     self.activateWindow() 
     self.raise_() 
     self.show() 

me trataron setFocus y activateWindow, pero que aún no ha dar el foco de nuevo a la ventana B.

¿Alguna sugerencia?

+0

¿le gusta este comportamiento con respecto a todas las demás ventanas o sólo a la ventana A. Si quiere lo último, puede hacer que Window B sea una ventana modal http://en.wikipedia.org/wiki/Modal_window. La ventana B es un elemento secundario de la ventana A que luego no se puede enfocar mientras la ventana B esté abierta. – halex

Respuesta

11

Para obtener window_b para estar siempre en la parte superior, tiene que agregar el indicador de ventana QtCore.Qt.WindowStaysOnTopHint. En su __init__ añadir la llamada

self.setWindowFlags(PyQt4.QtCore.Qt.WindowStaysOnTopHint) 

Tengo que añadir que esto sólo es una ayuda para el administrador de ventanas y no está garantizada para tener éxito.

+1

me funciona, pero no le devolvió el foco a window_b ahora window_b permanece siempre en la parte superior pero sin foco. – Uahmed

+0

@ user1224233 Ah bien. Leo * siempre enfocado * pero mi cerebro siempre * siempre arriba * de él :). Lo siento – halex

+0

Gracias solucionó la mitad de mi problema :) – Uahmed

2

self.raise_() seguido de un self.activateWindow() deben ser los comandos que está buscando, aunque no parece haber algún tipo de problemas con eso en mi SO Debian, por ejemplo, si hago clic en una ventana que se maximiza, la ventana obtener el enfoque, sino que también va a desaparecer, se ve como una especie de bichos, la secuencia en el método setTopLevelWindow se eludir ese comportamiento:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import sip 
sip.setapi('QString', 2) 
sip.setapi('QVariant', 2) 

from PyQt4 import QtGui, QtCore, QtWebKit, QtNetwork 

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

     self.button = QtGui.QPushButton(self) 
     self.button.setText("Show Dialog") 

     self.dialog = QtGui.QDialog(self) 
     self.dialog.setFocusPolicy(QtCore.Qt.StrongFocus) 
     self.dialog.installEventFilter(self) 

     self.button.clicked.connect(self.dialog.show) 

     self.setCentralWidget(self.button) 

    def eventFilter(self, obj, event): 
     if event.type() == QtCore.QEvent.WindowDeactivate: 
      self.setTopLevelWindow() 
      self.dialog.close() 

      return True 

     return False 

    def setTopLevelWindow(self):  
     if self.windowState() != QtCore.Qt.WindowMaximized: 
      self.showMaximized() 
      self.showNormal() 

     else: 
      self.showNormal() 
      self.showMaximized() 

     self.raise_() 
     self.activateWindow() 


if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('myWindow') 

    main = myWindow() 
    main.show() 

    sys.exit(app.exec_())