2012-09-05 201 views
7

我想重点放在一个窗口,如果用户点击另一个窗口。PyQt窗口焦点

现在,我有两个窗口:窗口A落后,和Window 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.

有什么建议?

+0

您希望这种行为对于所有其他窗口或只对窗口A.如果你想要后者,你可以使窗口B成为模态窗口http://en.wikipedia.org/wiki/Modal_window。然后,窗口B是窗口A的子窗口,只要窗口B打开,窗口B就不能被聚焦。 – halex

回答

11

要获得window_b总是保持在最佳状态,您必须添加窗口标记QtCore.Qt.WindowStaysOnTopHint。在你__init__添加通话

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

我要补充,这仅仅是一个暗示,窗口管理器,并且不保证成功。

+1

它适用于我,但它没有把焦点返回到window_b现在window_b保持总是最高但没有焦点。 – Uahmed

+0

@ user1224233好的。我读*总是集中注意力*但我的大脑总是在它的顶部* :)。对不起 – halex

+0

感谢它解决了我的问题的一半:) – Uahmed

2

self.raise_()后面跟着一个self.activateWindow()应该是您正在查找的命令,尽管在我的Debian操作系统上似乎存在某些问题,例如,如果我点击最大化的窗口,窗口将会获得焦点,但它也将消失,看起来像某种错误的,在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_())