QComboBox 单击在主 QDialog 上触发一个 leaveEvent
QComboBox click triggers a leaveEvent on the main QDialog
我正在尝试构建悬停对话框,但我卡在 QComboBox selection 和 QDialog 的 leaveEvent 之间的交互中。看起来当我尝试单击组合框到 select 某物时,它会触发一个 leaveEvent,然后隐藏我的 QDialog。为什么会这样?我怎样才能确保仅当我将鼠标移出对话框时才隐藏对话框?
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class hoverDialog(QDialog):
def __init__(self, parent=None):
super().__init__()
self.setAttribute(Qt.WA_DeleteOnClose)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.v = QVBoxLayout()
self.combobox = QComboBox()
self.combobox.addItems(['Work-around','Permanent'])
self.textedit = QPlainTextEdit()
self.v.addWidget(self.combobox)
self.v.addWidget(self.textedit)
self.setLayout(self.v)
#self.setMouseTracking(True)
def leaveEvent(self, event):
self.hide()
return super().leaveEvent(event)
class Table(QWidget):
def __init__(self, parent=None):
super().__init__()
self.label4 = QLabel()
self.label4.setText("hover popup")
self.label4.installEventFilter(self)
self.checkbox1 = QCheckBox()
self.pushButton3 = QPushButton()
self.pushButton3.setText('Generate')
self.pushButton3.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
self.pushButton3.clicked.connect(self.buttonPressed)
self.hbox5 = QHBoxLayout()
self.hbox5.addWidget(self.checkbox1)
self.hbox5.addWidget(self.label4)
self.hbox5.addWidget(self.pushButton3)
self.vbox1 = QVBoxLayout()
self.vbox1.addLayout(self.hbox5)
self.setLayout(self.vbox1)
self.autoResolve = hoverDialog(self)
def eventFilter(self, obj, event):
if obj == self.label4 and event.type() == QtCore.QEvent.Enter and self.autoResolve.isHidden():
self.onHovered()
return super().eventFilter(obj, event)
def onHovered(self):
pos = QtGui.QCursor.pos()
self.autoResolve.move(pos)
self.autoResolve.show()
def buttonPressed(self):
if self.checkbox.isChecked():
print('do something..')
if __name__ == '__main__':
app = QApplication(sys.argv)
form = Table()
form.show()
app.exec_()
查看源代码,我认为问题的根源在于每当显示新的弹出窗口小部件时 Qt 的行为。
我不能保证 100%,但无论如何,最简单的解决方案是仅在未显示组合弹出窗口时隐藏小部件:
def leaveEvent(self, event):
if not self.combobox.view().isVisible():
self.hide()
请注意,您的方法并不完美:由于对话框可以使用当前鼠标位置之外的几何图形显示,因此在鼠标实际进入之前它无法隐藏自己。您可能还应该过滤 FocusOut 和 WindowDeactivate 事件。
我正在尝试构建悬停对话框,但我卡在 QComboBox selection 和 QDialog 的 leaveEvent 之间的交互中。看起来当我尝试单击组合框到 select 某物时,它会触发一个 leaveEvent,然后隐藏我的 QDialog。为什么会这样?我怎样才能确保仅当我将鼠标移出对话框时才隐藏对话框?
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class hoverDialog(QDialog):
def __init__(self, parent=None):
super().__init__()
self.setAttribute(Qt.WA_DeleteOnClose)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.v = QVBoxLayout()
self.combobox = QComboBox()
self.combobox.addItems(['Work-around','Permanent'])
self.textedit = QPlainTextEdit()
self.v.addWidget(self.combobox)
self.v.addWidget(self.textedit)
self.setLayout(self.v)
#self.setMouseTracking(True)
def leaveEvent(self, event):
self.hide()
return super().leaveEvent(event)
class Table(QWidget):
def __init__(self, parent=None):
super().__init__()
self.label4 = QLabel()
self.label4.setText("hover popup")
self.label4.installEventFilter(self)
self.checkbox1 = QCheckBox()
self.pushButton3 = QPushButton()
self.pushButton3.setText('Generate')
self.pushButton3.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
self.pushButton3.clicked.connect(self.buttonPressed)
self.hbox5 = QHBoxLayout()
self.hbox5.addWidget(self.checkbox1)
self.hbox5.addWidget(self.label4)
self.hbox5.addWidget(self.pushButton3)
self.vbox1 = QVBoxLayout()
self.vbox1.addLayout(self.hbox5)
self.setLayout(self.vbox1)
self.autoResolve = hoverDialog(self)
def eventFilter(self, obj, event):
if obj == self.label4 and event.type() == QtCore.QEvent.Enter and self.autoResolve.isHidden():
self.onHovered()
return super().eventFilter(obj, event)
def onHovered(self):
pos = QtGui.QCursor.pos()
self.autoResolve.move(pos)
self.autoResolve.show()
def buttonPressed(self):
if self.checkbox.isChecked():
print('do something..')
if __name__ == '__main__':
app = QApplication(sys.argv)
form = Table()
form.show()
app.exec_()
查看源代码,我认为问题的根源在于每当显示新的弹出窗口小部件时 Qt 的行为。
我不能保证 100%,但无论如何,最简单的解决方案是仅在未显示组合弹出窗口时隐藏小部件:
def leaveEvent(self, event):
if not self.combobox.view().isVisible():
self.hide()
请注意,您的方法并不完美:由于对话框可以使用当前鼠标位置之外的几何图形显示,因此在鼠标实际进入之前它无法隐藏自己。您可能还应该过滤 FocusOut 和 WindowDeactivate 事件。