【问题标题】:PyQt Window FocusPyQt 窗口焦点
【发布时间】:2012-08-30 03:16:04
【问题描述】:

如果用户点击另一个窗口,我会尝试将焦点放在一个窗口上。

现在我有两个窗口:窗口 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。

有什么建议吗?

【问题讨论】:

  • 您希望这种行为适用于所有其他窗口还是仅适用于窗口 A。如果您想要后者,您可以将窗口 B 设置为模态窗口 en.wikipedia.org/wiki/Modal_window。然后窗口 B 是窗口 A 的子窗口,只要窗口 B 打开,它就不能被聚焦。

标签: python window focus pyqt pyqt4


【解决方案1】:

要让window_b 始终保持领先,您必须添加窗口标志QtCore.Qt.WindowStaysOnTopHint。在您的__init__ 中添加呼叫

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

我必须补充一点,这只是对窗口管理器的提示,并不保证成功。

【讨论】:

  • 它对我有用,但它没有将焦点返回给 window_b 现在 window_b 始终保持顶部但没有焦点。
  • @user1224233 好的。我阅读总是专注,但我的大脑总是在上面 :)。对不起
  • 对窗口有什么建议?
【解决方案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_())

【讨论】:

    【解决方案3】:
    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.setWindowModality(QtCore.Qt.ApplicationModal)
            self.setFocusPolicy(QtCore.Qt.StrongFocus)
    
        def focusOutEvent(self,event):
            self.setFocus(True)
            self.activateWindow()
            self.raise_()
            self.show()
    
    

    【讨论】:

    • 我们需要在问题中的代码中的哪个位置放置您为要解决的问题发布的行?
    【解决方案4】:

    我在那里找到了一个简单的技巧,只需使用 self.showNormal() 就可以了,将焦点返回到窗口,所以它是:

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

    就是这样! 玩得开心编码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多