Python 3.x Qt在窗口之间传递焦点
在下面的示例中,我有一个Qt按钮,它打开一个弹出窗口。然而,弹出窗口完全占据了焦点。是否可以对其进行修改,以便我仍然可以通过在主窗口上移动鼠标来与主窗口交互,例如,即使弹出窗口打开,也可以更改QDoubleSpinBox的值?我想我可能需要使用QtHoverEvent类,但我找不到一个好的例子来说明如何做到这一点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
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并提出上述其他建议后,单击该按钮将打开第二个窗口,该窗口仍然完全从主窗口获取焦点。