Qt设置某一窗口获取不到焦点,或者焦点一直在某一窗口上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt设置某一窗口获取不到焦点,或者焦点一直在某一窗口上相关的知识,希望对你有一定的参考价值。

Qt中通过一个窗口的操作,show出里一个窗口,这时候焦点就到了第二个窗口上,直到第二个窗口消失,焦点才能回到第一个窗口上,我想问的是如何使焦点一直在第一个窗口上,或者设置第二个窗口获取不到焦点,怎么办呢???
网上说:setAttribute(Qt::WA_X11DoNotAcceptFocus, true),可以实现,但是我用报错误: ‘WA_X11DoNotAcceptFocus’ is not a member of ‘Qt’

参考技术A 让第二个窗口以模态窗口显示不就行了。不要用show,我记得好像是用exec

Qt在窗口之间传递焦点

【中文标题】Qt在窗口之间传递焦点【英文标题】:Qt pass focus between windows 【发布时间】:2018-03-17 19:29:45 【问题描述】:

在下面的示例中,我有一个 Qt 按钮,可以打开一个弹出窗口。但是,弹出窗口完全占据焦点。是否可以修改它,以便我仍然可以通过将鼠标移到主窗口上来与它进行交互,例如即使弹出窗口打开,也要更改 QDoubleSpinBox 的值?我想我可能需要使用 QtHoverEvent 类,但我找不到一个很好的例子来说明如何做到这一点。

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QGridLayout, QDoubleSpinBox,\
    QLabel



class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        btn = QPushButton('Button', self)
        btn.move(50, 50) 
        btn2 = QDoubleSpinBox(self)
        btn2.move(50,100)

        self.sideWindowTest = sideWindowTest(self)
        btn.clicked.connect(lambda: self.sideWindowTest.setupWindow())

        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Main')

        self.show()

class sideWindowTest(object):

    myWdg = None

    def __init__(self, parent):
        super().__init__()
        self.viewer = parent

    def initiateMenuBar(self):
        self.myWdg.setWindowTitle('Phasing')
        self.myWdg.setWindowModality(Qt.ApplicationModal)
        MenuBar = QVBoxLayout()
        self.labels = 
            'phase 0': QLabel('Phase 0', self.myWdg),
        
        self.inputs = 
            'phase 0': QDoubleSpinBox(self.myWdg),
        

        for i in self.inputs.values():
            i.installEventFilter(self.myWdg)

        self.inputs['phase 0'].setValue(0)

        MenuBar.addWidget(self.labels['phase 0'])
        MenuBar.addWidget(self.inputs['phase 0'])
        MenuBar.addStretch(1)

        return MenuBar

    def setupWindow(self):

        if not self.myWdg:
            self.myWdg = QWidget()

            MenuBar = self.initiateMenuBar()

            grid = QGridLayout()
            grid.setSpacing(10)        

            grid.addLayout(MenuBar, 0, 0, 1, 2)
            self.myWdg.setLayout(grid)
            self.myWdg.setGeometry(0, 0, 400, 100)

        self.myWdg.show()
        self.myWdg.activateWindow() 


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

是的,但您必须明确地将您的 QWidget 包装在 QDialogQMainWindow 中。默认情况下,如果你创建了一个孤儿 QWidget(就像你正在做的那样),Qt 会将它包装在一个 QDialog 中。

只需将您的课程类型更改为QDialog。此外,您可能应该将初始主窗口作为父窗口传入。

btn.clicked.connect(lambda: self.sideWindowTest.setupWindow(self))

...


def setupWindow(self, parent=None):

    if not self.myWdg:
        self.myWdg = QDialog(parent)

【讨论】:

我已经尝试过这个建议,但它并没有解决问题。在更改为 QDialog 并提出上述其他建议后,单击按钮会打开第二个窗口,该窗口仍然完全从主窗口获得焦点。

以上是关于Qt设置某一窗口获取不到焦点,或者焦点一直在某一窗口上的主要内容,如果未能解决你的问题,请参考以下文章

android某一app设为焦点app

Qt中的键盘事件,以及焦点的设置(比较详细)

如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置

Qt在窗口之间传递焦点

Qt实用技巧:将QWidget作为输入窗口,接收键盘消息输入法并且控制输入法悬浮工具栏位置控制

Qt的焦点策略