Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Qt在窗口之间传递焦点_Python 3.x_Qt_Pyqt_Pyqt5 - Fatal编程技术网

Python 3.x Qt在窗口之间传递焦点

Python 3.x Qt在窗口之间传递焦点,python-3.x,qt,pyqt,pyqt5,Python 3.x,Qt,Pyqt,Pyqt5,在下面的示例中,我有一个Qt按钮,它打开一个弹出窗口。然而,弹出窗口完全占据了焦点。是否可以对其进行修改,以便我仍然可以通过在主窗口上移动鼠标来与主窗口交互,例如,即使弹出窗口打开,也可以更改QDoubleSpinBox的值?我想我可能需要使用QtHoverEvent类,但我找不到一个好的例子来说明如何做到这一点 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QWidget, QP

在下面的示例中,我有一个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_())

是的,但是您必须在
QDialog
QMainWindow
中显式地包装
QWidget
。默认情况下,如果您创建一个孤立的
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并提出上述其他建议后,单击该按钮将打开第二个窗口,该窗口仍然完全从主窗口获取焦点。