2012-09-05 31 views
7

ユーザーが別のウィンドウをクリックすると、ウィンドウにフォーカスを合わせようとしています。PyQtウィンドウのフォーカス

私は2つのウィンドウを持っています:ウィンドウAが後ろにあり、ウィンドウBが前面にあります。ウィンドウBが表示されたら、それは私が何をしたい今すぐウィンドウA.を無効にするたびにウィンドウBの外側にユーザ​​ーがクリック、それはここに戻ってウィンドウB.に

をフォーカスを与えるべきであるということですが、ウィンドウ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() 

私はsetFocusactivateWindowを試してみましたが、それはバックウィンドウB.

に任意の提案をフォーカスを与えるdidntは?

+0

ます他のすべてのウィンドウに関しては、この動作のようなまたは唯一のウィンドウAになり後者が必要な場合は、ウィンドウBをモーダルウィンドウhttp://en.wikipedia.org/wiki/Modal_windowにすることができます。ウィンドウBはウィンドウAの子であり、その後はウィンドウBが開いている限り焦点を合わせることができない。 – halex

答えて

11

window_bを常に先頭に置くには、ウィンドウフラグQtCore.Qt.WindowStaysOnTopHintを追加する必要があります。あなたの__init__では、私はこれが唯一のウィンドウマネージャへのヒントであり、成功する保証はないことを追加する必要がコール

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

を追加します。

+1

それは私のために働くが、それは今window_bにフォーカスを戻さなかった。 – Uahmed

+0

@ user1224233ああ。私は*常にフォーカス*で読むが、私の脳は常にそれの上に*を作った:)。申し訳ありません – halex

+0

私の問題の半分を解決してくれてありがとう:) – Uahmed

2

self.raise_()これに続くself.activateWindow()は、私のDebian OS上で何か問題が起きているようですが、例えば最大化されたウィンドウをクリックすると、バグのいくつかの種類のように見える、フォーカスを得るが、それはまた消えます、setTopLevelWindow方法のシーケンスは、その動作を回避します:

#!/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_()) 
関連する問題