2012-09-05 11 views
7

Sto cercando di mettere a fuoco una finestra se l'utente fa clic su un'altra finestra.PyQt Window Focus

In questo momento ho due finestre: la finestra A è dietro e la finestra B è davanti. Quando appare finestra B, disabilita Finestra A. Ora quello che voglio è che ogni volta che l'utente fa clic al di fuori della finestra B, si dovrebbe dare attenzione torna alla finestra B.

Ecco il codice per la finestra 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() 

ho cercato setFocus e activateWindow, ma non ha ancora dare attenzione torna alla finestra B.

Qualche suggerimento?

+0

Volete questo comportamento rispetto a tutte le altre finestre o solo per Window A. Se vuoi il secondo puoi rendere Window B una finestra modale http://en.wikipedia.org/wiki/Modal_window. La Finestra B è quindi un elemento secondario della Finestra A che in seguito non può essere focalizzata fintanto che la Finestra B è aperta. – halex

risposta

11

Per ottenere window_b per rimanere sempre in cima, è necessario aggiungere il windowflag QtCore.Qt.WindowStaysOnTopHint. Nel vostro __init__ aggiungere la chiamata

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

Devo aggiungere che questo è solo un suggerimento per il manager a finestre e non garantito per avere successo.

+1

funziona per me ma non ha ridato priorità a window_b ora window_b rimane sempre in primo piano ma senza messa a fuoco. – Uahmed

+0

@ user1224233 Ah ok. Ho letto * sempre a fuoco * ma il mio cervello * si è sempre messo in primo piano *. Scusa – halex

+0

Grazie risolto metà del mio problema :) – Uahmed

2

self.raise_() seguito da un self.activateWindow() dovrebbero essere i comandi che stai cercando, anche se sembra esserci qualche tipo di problema con quello sul mio sistema Debian, per esempio, se clicco su una finestra che è massimizzata, la finestra ottenere messa a fuoco, ma sarà anche scomparire, si presenta come una sorta di bug, la sequenza nel metodo setTopLevelWindow sarà aggirare questo comportamento:

#!/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_())